ASP.NET InnerXml автоматически / неправильно добавляет текст атрибута в теги - PullRequest
1 голос
/ 17 декабря 2008

Итак, у меня есть 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) тега . Однако, используя

xmlDoc.SelectSingleNode("somenode/html/body")

возвращает null, используя

xmlDoc.GetElementsByTagName("body")[0].InnerXml

дает InnerXml - но к каждому

добавляется 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 не подходит.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2008

Ваше выражение 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);
0 голосов
/ 17 декабря 2008

Поскольку элемент <html> определяет пространство имен по умолчанию равным http://www.w3.org/1999/xhtml. Все элементы внутри него без префикса пространства имен по умолчанию имеют одинаковое пространство имен.

Поскольку содержимое тега body состоит из 2 отдельных <p> элементов, они оба получают объявление. Если у вас есть другие элементы внутри ваших <p> элементов, у них не будет декларации.

...