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ノードに必要なプレフィックス(名前空間)がわかりましたので、クラスを適切に適合させる方法がわかりません。