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
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
будет содержать первый дочерний узел «мыло: тело».
Поскольку 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);
Это вернет первый непустой элемент.
@dsi - Есть ли в вашем xml атрибут xml:space = "preserve"
?
это сработало, но первый дочерний элемент как пробел... нужно пропустить элемент пробела. Есть ли способ пропустить его и вытащить nextChild?