如何 select 来自 xmldocument 的特定级别节点
How to select particular level node from xmldocument
XmlDocument 如下所示,要select<soap:Body>
下的一个节点
所以,path: soap:Envelope/soap:Body/
下的任何第一个节点,所以,在下面的例子中,需要 select "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
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"
的第一个子节点
因为 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"
属性,以上代码可以return一个空白节点
我可以提供以下内容:
XmlNode first = doc.SelectSingleNode("//soap:Body/*[text()]", manager);
这将 return 第一个 non-empty 元素。
XmlDocument 如下所示,要select<soap:Body>
所以,path: soap:Envelope/soap:Body/
下的任何第一个节点,所以,在下面的例子中,需要 select "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
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"
因为 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"
属性,以上代码可以return一个空白节点
我可以提供以下内容:
XmlNode first = doc.SelectSingleNode("//soap:Body/*[text()]", manager);
这将 return 第一个 non-empty 元素。