0

XmlDocument 如下所示,要选择下面的一个节点<soap:Body>

所以,so下的任何第一个节点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

4

2 回答 2

1

因为 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);

这将返回第一个非空元素。

于 2019-07-10T12:28:00.947 回答
0
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”的第一个子节点

于 2019-07-10T02:40:53.590 回答