2016-07-09 13 views
0

XMLデータバインディングウィザードを使用して、IRS XML仕様ファイルのクラスを作成しました。私は答えが見つからない2つの問題を抱えている(そして私は何時間も試してみた)。あなたはルートノードがデフォルトのxmlns名前空間を使用していない見ることができるようにC++ BuilderでXMLノードに名前空間と接頭辞を割り当てる方法

<?xml version="1.0" encoding="UTF-8"?> 
<h1:ACAUIBusinessHeader xmlns="urn:us:gov:treasury:irs:ext:aca:air:7.0" xmlns:irs="urn:us:gov:treasury:irs:common" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:acabushdr="urn:us:gov:treasury:irs:msg:acabusinessheader" xmlns:h1="urn:us:gov:treasury:irs:msg:acauibusinessheader" xsi:schemaLocation="urn:us:gov:treasury:irs:msg:acauibusinessheader IRS-ACAUserInterfaceHeaderMessage.xsd"> 
    <acabushdr:ACABusinessHeader> 
     <UniqueTransmissionId>00000000-0000-0000-0000-000000000000:SYS12:BB000::T</UniqueTransmissionId> 
     <irs:Timestamp>2001-12-17T09:30:47Z</irs:Timestamp> 
    </acabushdr:ACABusinessHeader> 
    <ACATransmitterManifestReqDtl> 
     <PaymentYr>1000</PaymentYr> 
     <PriorYearDataInd>1</PriorYearDataInd> 
     <irs:EIN>000000000</irs:EIN> 
    </ACATransmitterManifestReqDtl> 
</h1:ACATransmitterManifestReqDtl> 

これは私が必要とするXML出力の抜粋です。 GetDocBinding()の呼び出しで名前に "h1:"接頭辞を追加すると、必要なものではないすべての子ノードに "h1:"接頭辞が追加されます。

また、データバインディングウィザードで作成したクラスを手動で編集して、DeclareNamespace()メソッドを使用して余分な名前空間を定義できるようにしました。しかし、RegisterChildNode()メソッドのオプションの3番目のパラメータを使用してURIを定義しようとすると、そのノードのプロパティを使用しようとするとクラッシュします。ここで

は、編集されたクラスのコードスニペットです:私は三番目のパラメータを取る場合

Manifest = new TXMLDocument(GetWindow()); 
     Manifest->DOMVendor = GetDOMVendor("MSXML"); // NOT cross platform compatible 
     Manifest->NodeIndentStr = char(9); // TAB character 
     Manifest->Options = Manifest->Options << doNodeAutoIndent << doAttrNull << doAutoPrefix; 

     Manifest_root = GetACAUIBusinessHeader(Manifest); 

     Manifest->Version = "1.0"; 
     Manifest->Encoding = "UTF-8"; 

     // Assign NameSpaces and Schema 
     Manifest_root->irs_NS = "urn:us:gov:treasury:irs:common"; 
     Manifest_root->xsi_NS = "http://www.w3.org/2001/XMLSchema-instance"; 
     Manifest_root->acabushdr_NS = "urn:us:gov:treasury:irs:msg:acabusinessheader"; 
     Manifest_root->h1_NS = "urn:us:gov:treasury:irs:msg:acauibusinessheader"; 
     Manifest_root->schemaLocation = "urn:us:gov:treasury:irs:msg:acauibusinessheader IRS-ACAUserInterfaceHeaderMessage.xsd"; 

     Manifest_root->ACABusinessHeader->UniqueTransmissionId = "token"; // Just for testing 
     Manifest_root->ACABusinessHeader->Timestamp = "2001-12-17T09:30:47Z"; // Just for testing 

     Manifest_root->ACATransmitterManifestReqDtl->PaymentYr = "2016"; 
     Manifest_root->ACATransmitterManifestReqDtl->PriorYearDataInd = "1"; 
     Manifest_root->ACATransmitterManifestReqDtl->EIN = "000000000"; 

_di_IXMLTransmitterACAUIBusinessHeaderType __fastcall GetACAUIBusinessHeader(Xml::Xmlintf::_di_IXMLDocument Doc) 
    { 
     return (_di_IXMLTransmitterACAUIBusinessHeaderType) Doc->GetDocBinding("ACAUIBusinessHeader", __classid(TXMLTransmitterACAUIBusinessHeaderType), eACA_UI_Header_TargetNamespace); 
    }; 

    _di_IXMLTransmitterACAUIBusinessHeaderType __fastcall GetACAUIBusinessHeader(Xml::Xmldoc::TXMLDocument *Doc) 
    { 
     Xml::Xmlintf::_di_IXMLDocument DocIntf; 
     Doc->GetInterface(DocIntf); 
     return GetACAUIBusinessHeader(DocIntf); 
    }; 

    _di_IXMLTransmitterACAUIBusinessHeaderType __fastcall LoadACAUIBusinessHeader(const System::UnicodeString& FileName) 
    { 
     return (_di_IXMLTransmitterACAUIBusinessHeaderType) Xml::Xmldoc::LoadXMLDocument(FileName)->GetDocBinding("ACAUIBusinessHeader", __classid(TXMLTransmitterACAUIBusinessHeaderType), eACA_UI_Header_TargetNamespace); 
    }; 

    _di_IXMLTransmitterACAUIBusinessHeaderType __fastcall NewACAUIBusinessHeader() 
    { 
     return (_di_IXMLTransmitterACAUIBusinessHeaderType) Xml::Xmldoc::NewXMLDocument()->GetDocBinding("ACAUIBusinessHeader", __classid(TXMLTransmitterACAUIBusinessHeaderType), eACA_UI_Header_TargetNamespace); 
    }; 

    // TXMLTransmitterACAUIBusinessHeaderType 

    void __fastcall TXMLTransmitterACAUIBusinessHeaderType::AfterConstruction(void) 
    { 
     RegisterChildNode(System::UnicodeString("ACABusinessHeader"), __classid(TXMLACABulkBusinessHeaderRequestType_air7_0), "urn:us:gov:treasury:irs:common"); 
     RegisterChildNode(System::UnicodeString("ACATransmitterManifestReqDtl"), __classid(TXMLACATrnsmtManifestReqDtlType_air7_0)); 
     Xml::Xmldoc::TXMLNode::AfterConstruction(); 
    }; 

    UnicodeString __fastcall TXMLTransmitterACAUIBusinessHeaderType::Get_irs_NS() 
    { 
     return TXMLNode::AttributeNodes->Nodes[UnicodeString("xmlns:irs")]->Text; 
    }; 

    void __fastcall TXMLTransmitterACAUIBusinessHeaderType::Set_irs_NS(UnicodeString Value) 
    { 
     //TXMLNode::SetAttributeNS(UnicodeString("xmlns:irs"), "", Value); 
     TXMLNode::DeclareNamespace(UnicodeString("irs"), Value); 
    }; 
// More of the same 

そして、ここでは、私はクラスを使用して出力をテストするために書いたいくつかの予備のコードです上記のコードのRegisterChildNode()メソッドはクラッシュしませんが、出力は正しくありません:

<?xml version="1.0" encoding="UTF-8"?> 
<ACAUIBusinessHeader xmlns="urn:us:gov:treasury:irs:ext:aca:air:7.0" xmlns:irs="urn:us:gov:treasury:irs:common" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:acabushdr="urn:us:gov:treasury:irs:msg:acabusinessheader" xmlns:h1="urn:us:gov:treasury:irs:msg:acauibusinessheader" xsi:schemaLocation="urn:us:gov:treasury:irs:msg:acauibusinessheader IRS-ACAUserInterfaceHeaderMessage.xsd"> 
    <ACABusinessHeader> 
     <UniqueTransmissionId>token</UniqueTransmissionId> 
     <Timestamp>2001-12-17T09:30:47Z</Timestamp> 
    </ACABusinessHeader> 
    <ACATransmitterManifestReqDtl> 
     <PaymentYr>2016</PaymentYr> 
     <PriorYearDataInd>1</PriorYearDataInd> 
     <EIN>000000000</EIN> 
    </ACATransmitterManifestReqDtl> 
</ACAUIBusinessHeader> 

ルートノードACAUIBusinessHeader、ACABusinessHeaderノード、およびTimestamp & EINノードに必要なプレフィックス(名前空間)がわかりましたので、クラスを適切に適合させる方法がわかりません。

答えて

0

最終的に、生成されたXMLクラスをどのように適応させて所望の出力を得るかを知ることができました。私はAfterConstruction()関数へのDeclareNamespace()呼び出しを移動し、異なる名前空間を使用したノードのGet()関数呼び出し(および該当する場合はSet())を変更しなければなりませんでした。

はここで適応コードの最初の部分です:

_di_IXMLTransmitterACAUIBusinessHeaderType __fastcall GetACAUIBusinessHeader(Xml::Xmlintf::_di_IXMLDocument Doc) 
{ 
    return (_di_IXMLTransmitterACAUIBusinessHeaderType) Doc->GetDocBinding("n1:ACAUIBusinessHeader", __classid(TXMLTransmitterACAUIBusinessHeaderType), nsN1); 
}; 

_di_IXMLTransmitterACAUIBusinessHeaderType __fastcall GetACAUIBusinessHeader(Xml::Xmldoc::TXMLDocument *Doc) 
{ 
    Xml::Xmlintf::_di_IXMLDocument DocIntf; 
    Doc->GetInterface(DocIntf); 
    return GetACAUIBusinessHeader(DocIntf); 
}; 

_di_IXMLTransmitterACAUIBusinessHeaderType __fastcall LoadACAUIBusinessHeader(const System::UnicodeString& FileName) 
{ 
    return (_di_IXMLTransmitterACAUIBusinessHeaderType) Xml::Xmldoc::LoadXMLDocument(FileName)->GetDocBinding("n1:ACAUIBusinessHeader", __classid(TXMLTransmitterACAUIBusinessHeaderType), nsN1); 
}; 

_di_IXMLTransmitterACAUIBusinessHeaderType __fastcall NewACAUIBusinessHeader() 
{ 
    return (_di_IXMLTransmitterACAUIBusinessHeaderType) Xml::Xmldoc::NewXMLDocument()->GetDocBinding("n1:ACAUIBusinessHeader", __classid(TXMLTransmitterACAUIBusinessHeaderType), nsN1); 
}; 

// TXMLTransmitterACAUIBusinessHeaderType 

void __fastcall TXMLTransmitterACAUIBusinessHeaderType::AfterConstruction(void) 
{ 
    TXMLNode::DeclareNamespace(System::UnicodeString(""), nsACA); // default xmlns 
    TXMLNode::DeclareNamespace(System::UnicodeString("irs"), nsIRS); 
    TXMLNode::DeclareNamespace(System::UnicodeString("xsi"), nsXSI); 
    TXMLNode::DeclareNamespace(System::UnicodeString("acabushdr"), nsACAbushdr); 
    TXMLNode::DeclareNamespace(System::UnicodeString("n1"), nsN1); 
    RegisterChildNode(System::UnicodeString("ACABusinessHeader"), __classid(TXMLACABulkBusinessHeaderRequestType_air7_0), nsACAbushdr); 
    RegisterChildNode(System::UnicodeString("ACATransmitterManifestReqDtl"), __classid(TXMLACATrnsmtManifestReqDtlType_air7_0), nsACA); 
    TXMLNode::SetAttribute(System::UnicodeString("xsi:schemaLocation"), SchemaLoc); 
    Xml::Xmldoc::TXMLNode::AfterConstruction(); 
}; 

_di_IXMLACABulkBusinessHeaderRequestType_air7_0 __fastcall TXMLTransmitterACAUIBusinessHeaderType::Get_ACABusinessHeader() 
{ 
    _di_IXMLACABulkBusinessHeaderRequestType_air7_0 result = GetChildNodes()->FindNode("acabushdr:ACABusinessHeader", nsACAbushdr); 
    if(result == NULL) 
     result = GetChildNodes()->Nodes[System::UnicodeString("acabushdr:ACABusinessHeader")]; // creates it 
    return result; 
}; 

_di_IXMLACATrnsmtManifestReqDtlType_air7_0 __fastcall TXMLTransmitterACAUIBusinessHeaderType::Get_ACATransmitterManifestReqDtl() 
{ 
    _di_IXMLACATrnsmtManifestReqDtlType_air7_0 result = GetChildNodes()->FindNode("ACATransmitterManifestReqDtl", nsACA); 
    if(result == NULL) // Because this XML document doesn't use the default xmlns for the "root" node, but this node DOES use the default xmlns, it has to be added this way to match up the namespace 
     result = AddChild("ACATransmitterManifestReqDtl", nsACA); // creates it 
    return result; 
}; 

「nsACA」とそのいとこは単なる定数UnicodeStringsです。ご覧のとおり、GetDocBinding()呼び出しでルートノードの名前に "n1:"接頭辞/名前空間を追加する必要がありました。名前空間は後でAfterConstruction()関数で宣言されます。 "irs:"接頭辞/名前空間を使用するノードでは、AfterConstruction()関数で宣言されたノード文字列名に単純に追加するだけで十分でした。ここでは例です:少しより複雑子ノードの一つは、それが親ノードから名前空間のような接頭辞を持っていないデフォルトのxmlns名前空間を(使用しているのです継承していない場合があります

System::UnicodeString __fastcall TXMLACABulkBusinessHeaderRequestType_air7_0::Get_Timestamp() 
{ 
    return GetChildNodes()->Nodes[System::UnicodeString("irs:Timestamp")]->NodeValue.operator System::UnicodeString(); 
}; 

void __fastcall TXMLACABulkBusinessHeaderRequestType_air7_0::Set_Timestamp(System::UnicodeString Value) 
{ 
    GetChildNodes()->Nodes[System::UnicodeString("irs:Timestamp")]->NodeValue = Value; 
}; 

"irs:"の例)。ここで私はUniqueTransmissionIdノードのためのそのような場合を取り扱う方法は次のとおりです。

System::UnicodeString __fastcall TXMLACABulkBusinessHeaderRequestType_air7_0::Get_UniqueTransmissionId() 
{ 
    _di_IXMLNode result = GetChildNodes()->FindNode("UniqueTransmissionId", nsACA); 
    if(result == NULL) 
     return EmptyStr; 
    return result->NodeValue.operator System::UnicodeString(); 
    //return GetChildNodes()->Nodes[System::UnicodeString("UniqueTransmissionId")]->NodeValue.operator System::UnicodeString(); 
}; 

void __fastcall TXMLACABulkBusinessHeaderRequestType_air7_0::Set_UniqueTransmissionId(System::UnicodeString Value) 
{ 
    _di_IXMLNode result = GetChildNodes()->FindNode("UniqueTransmissionId", nsACA); 
    if(result == NULL) // Because this XML document doesn't use the default xmlns for the "root" node, but this node DOES use the default xmlns, it has to be added this way to match up the namespace 
     result = AddChild("UniqueTransmissionId", nsACA); // creates it 
    result->NodeValue = Value; 
    //GetChildNodes()->Nodes[System::UnicodeString("UniqueTransmissionId")]->NodeValue = Value; 
}; 

をそしてここで最終的な出力です:

<?xml version="1.0" encoding="UTF-8"?> 
<n1:ACAUIBusinessHeader xmlns="urn:us:gov:treasury:irs:ext:aca:air:7.0" xmlns:irs="urn:us:gov:treasury:irs:common" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:acabushdr="urn:us:gov:treasury:irs:msg:acabusinessheader" xmlns:n1="urn:us:gov:treasury:irs:msg:acauibusinessheader" xsi:schemaLocation="urn:us:gov:treasury:irs:msg:acauibusinessheader IRS-ACAUserInterfaceHeaderMessage.xsd"> 
    <acabushdr:ACABusinessHeader> 
     <UniqueTransmissionId>token</UniqueTransmissionId> 
     <irs:Timestamp>2001-12-17T09:30:47Z</irs:Timestamp> 
    </acabushdr:ACABusinessHeader> 
    <ACATransmitterManifestReqDtl> 
     <PaymentYr>2016</PaymentYr> 
     <PriorYearDataInd>1</PriorYearDataInd> 
     <irs:EIN>000000000</irs:EIN> 
    </ACATransmitterManifestReqDtl> 
</n1:ACAUIBusinessHeader> 

がうまくいけば、これは、Delphi/C++ BuilderのXMLデータバインドウィザードでの作業誰にも役立つことを証明します。それは、単独の名前空間だけを扱うことができるように見えますが、このような変更によっても、それはまだ始めるのに適しています。

関連する問題