Итак, у меня есть XML в следующем формате:
<somenode>
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title/>
</head>
<body>
<p>P one</p>
<p>Another p</p>
</body>
</html>
</somenode>
Там есть некоторый html, который, я не думал, будет проблемой, так как он будет обрабатываться просто как xml.
Я пытаюсь выбрать содержимое (InnerXml) тега <body>. Однако, используя
xmlDoc.SelectSingleNode("somenode/html/body")
возвращает null, и используя
xmlDoc.GetElementsByTagName("body")[0].InnerXml
дает InnerXml, но к каждому <p> добавлен xmlns = "http://www.w3.org/1999/xhtml", поэтому результат выглядит так:
<p xmlns = "http://www.w3.org/1999/xhtml">P one</p><p xmlns = "http://www.w3.org/1999/xhtml">Another p</p>
Может кто-нибудь пролить некоторый свет на это? Похоже, какое-то действительно странное поведение, любая помощь будет принята с благодарностью. Я использую только ASP.net 2.0, поэтому, к сожалению, попытка linq не вариант.





Поскольку элемент <html> определяет пространство имен по умолчанию как http://www.w3.org/1999/xhtml. Все элементы внутри него без префикса пространства имен по умолчанию имеют одно и то же пространство имен.
Поскольку содержимое тега body - это 2 отдельных элемента <p>, они оба получают объявление. Если у вас были другие элементы внутри ваших элементов <p>, на них не будет объявления.
В вашем выражении xpath не указано пространство имен по умолчанию. Как насчет:
XmlNamespaceManager nsMgr = new XmlNamespaceManager(xmlDoc.NameTable);
nsMgr.AddNamespace("xhtml", "http://www.w3.org/1999/xhtml");
XmlNode node = xmlDoc.SelectSingleNode("somenode/xhtml:html/xhtml:body", nsMgr);
Великолепно, спасибо вам обоим :) очень признателен