Как выбрать конкретный узел уровня из xmldocument - PullRequest
0 голосов
/ 10 июля 2019

XmlDocument выглядит так, как показано ниже, необходимо выбрать один узел, который находится под <soap:Body>

, поэтому любой первый узел под path: soap:Envelope/soap:Body/, поэтому в приведенном ниже примере необходимо выбрать элемент «DynamicNode» (Но, он не должен быть через "DynamicNode", так как это может быть любое имя в soap:Envelope/soap:Body/

 <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Header>
    </soap:Header>
    <soap:Body>
        <DynamicNode> ....</DynamicNode>
    </soap:Body>
</soap:Envelope>

Пробовал с doc.DocumentElement.SelectSingleNode ("soap: Envelope / soap: Body /"), ноне сработало и выдает исключение.

Примечание: нельзя использовать Linq.Xml

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Поскольку xml содержит пространства имен, необходимо использовать XmlNamespaceManager.

XmlDocument doc = new XmlDocument();
doc.Load("test.xml");

XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable);
manager.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");

XmlNode body = doc.SelectSingleNode("//soap:Body", manager);
XmlNode first = body.FirstChild; // DynamicNode

Если xml имеет атрибут xml:space="preserve", приведенный выше код может вернуть узел пробела.

Я могу предложить следующее:

XmlNode first = doc.SelectSingleNode("//soap:Body/*[text()]", manager);

Это вернет первый непустой элемент.

0 голосов
/ 10 июля 2019
XmlDocument doc = new XmlDocument();
doc.LoadXml(...);

XmlNode target;
XmlNode root = doc.FirstChild;
for (int i = 0; i < root.ChildNodes.Count; i++)
{
    if (root.ChildNodes[i].Name == "soap:Body")
    {
         target = root.ChildNodes[i].ChildNodes[0];
    }

}

Не элегантно, но target будет содержать первый дочерний узел "soap: Body"

...