2009-07-09 11 views
3

私は情報を追跡するアクセスUPSにしようとしていると、彼らの例のように、私はそうのような要求を構築する必要があります:C#のXmlDocumentノード

<?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> 

私は中1つのXmlDocumentでこれを作成する問題を抱えていますC#。私は2番目を追加しようとすると: <?xml version="1.0" ?> or the <TrackRequest> それはエラーがスローされます。

System.InvalidOperationException: This document already has a 'DocumentElement' node.

私はこれを推測している標準のXmlDocumentのみ1つのルートノードを持ってしまうためです。何か案は?これまで

はHERESに私のコード:

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); 
+0

エラーが発生した場所にコードを掲載したい場合があります。そうでなければ、私たちは電話で質問された自動車技術者のようなものです:「私の車は始まりません。何が問題なのですか? – Cyberherbalist

+0

また、提供されているこの例は1回のリクエストであることを確認してください。それは、2つの異なるタイプのリクエストによく似ています。 最初はアクセスを要求し、2番目は追跡情報を要求します。 –

+0

これはまさにその例です。従来のASPと同様のものを使用し、両方のXMLリクエストはMsxml2.ServerXMLHTTPオブジェクトを介して同時に送信されます。 –

答えて

9

XML文書には1つのルートノードしか存在できません。それ以外の場合は、うまく形成されません。 2つのXML文書を作成して、両方を一度に送信する必要がある場合は、それらを一緒に結合する必要があります。

0

、2つの別々のXML文書を作成し、その文字列表現を連結します。

2

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

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

0

ノード構造が常に同じであるように見えます。 (私には条件付きのロジックはありません)。構造が一定であれば、XMLテンプレート文字列を定義することができます。その文字列をXML文書にロードする& SelectNodeを実行して個々のノードを設定します。

これは、プログラムでルートを作成するよりも簡単であるかもしれませんが、要素&ノードです。

関連する問題