C # XmlDocument Nodes - PullRequest
       35

C # XmlDocument Nodes

3 голосов
/ 09 июля 2009

Я пытаюсь получить доступ к информации об отслеживании 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>

У меня проблема с созданием этого с 1 XmlDocument в C #. Когда я пытаюсь добавить второе: <?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 ]

9 голосов
/ 09 июля 2009

XML-документ может иметь только один корневой узел. В противном случае это не очень хорошо сформировано. Вам нужно будет создать 2 XML-документа и объединить их, если вам нужно отправить оба документа одновременно.

2 голосов
/ 09 июля 2009

Это вызывает исключение, потому что вы пытаетесь создать недопустимый XML. XmlDocument будет генерировать только правильно сформированный xml.

Вы можете сделать это с помощью XMLWriter и установить для XmlWriterSettings.ConformanceLevel значение Fragment или создать два XmlDocuments и записать их в один поток.

0 голосов
/ 09 июля 2009

Похоже, что ваша структура узла всегда будет одинаковой. (Я не вижу никакой условной логики.) Если структура постоянна, вы можете определить строку шаблона XML. Загрузите эту строку в XML-документ и выполните SelectNode для заполнения отдельных узлов.

Это может быть проще / чище, чем программное создание корня, элементов и узлов.

0 голосов
/ 09 июля 2009

Создайте два отдельных XML-документа и объедините их строковое представление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...