3

UPS追跡情報にアクセスしようとしていますが、その例のように、次のようなリクエストを作成する必要があります。

<?xml version="1.0" ?>
<AccessRequest xml:lang='en-US'>
   <AccessLicenseNumber>YOURACCESSLICENSENUMBER</AccessLicenseNumber>
   <UserId>YOURUSERID</UserId>
   <Password>YOURPASSWORD</Password>
</AccessRequest>
<?xml version="1.0" ?>
<TrackRequest>
   <Request>
     <TransactionReference>
         <CustomerContext>guidlikesubstance</CustomerContext>
     </TransactionReference>
     <RequestAction>Track</RequestAction>
   </Request>
   <TrackingNumber>1Z9999999999999999</TrackingNumber>
</TrackRequest>

C#で1つのXmlDocumentを使用してこれを作成する際に問題が発生しました。2番目を追加しようとすると: <?xml version="1.0" ?> or the <TrackRequest> エラーがスローされます:

System.InvalidOperationException:このドキュメントにはすでに「DocumentElement」ノードがあります。

これは、標準のXmlDocumentにはルートノードが1つしかないためだと思います。何か案は?

これまでの私のコードは次のとおりです。

XmlDocument xmlDoc = new XmlDocument();
XmlDeclaration xmlDeclaration = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null);
XmlElement rootNode = xmlDoc.CreateElement("AccessRequest");
rootNode.SetAttribute("xml:lang", "en-US");
xmlDoc.InsertBefore(xmlDeclaration, xmlDoc.DocumentElement);
xmlDoc.AppendChild(rootNode);

XmlElement licenseNode = xmlDoc.CreateElement("AccessLicenseNumber");
XmlElement userIDNode = xmlDoc.CreateElement("UserId");
XmlElement passwordNode = xmlDoc.CreateElement("Password");

XmlText licenseText = xmlDoc.CreateTextNode("mylicense");
XmlText userIDText = xmlDoc.CreateTextNode("myusername");
XmlText passwordText = xmlDoc.CreateTextNode("mypassword");

rootNode.AppendChild(licenseNode);
rootNode.AppendChild(userIDNode);
rootNode.AppendChild(passwordNode);

licenseNode.AppendChild(licenseText);
userIDNode.AppendChild(userIDText);
passwordNode.AppendChild(passwordText);

XmlElement rootNode2 = xmlDoc.CreateElement("TrackRequest");
xmlDoc.AppendChild(rootNode2);
4

4 に答える 4

9

XML ドキュメントは、ルート ノードを 1 つだけ持つことができます。そうしないと、うまく形成されません。一度に両方を送信する必要がある場合は、2 つの xml ドキュメントを作成して結合する必要があります。

于 2009-07-09T15:21:46.493 に答える
2

無効な xml を作成しようとしているため、例外がスローされます。XmlDocument は整形式の xml のみを生成します。

XMLWriter を使用して XmlWriterSettings.ConformanceLevel を Fragment に設定するか、2 つの XmlDocuments を作成して同じストリームに書き出すことができます。

于 2009-07-09T15:27:41.270 に答える
0

ノード構造は常に同じようです。(条件付きロジックは見当たりません。) 構造が一定の場合、XML テンプレート文字列を定義できます。その文字列を XML ドキュメントにロードし、SelectNode を実行して個々のノードに入力します。

これは、ルート、要素、およびノー​​ドをプログラムで作成するよりも単純/クリーンになる場合があります。

于 2009-07-09T16:40:13.543 に答える
0

2 つの別個の XML ドキュメントを作成し、それらの文字列表現を連結します。

于 2009-07-09T15:20:27.900 に答える