Почему XmlDocument.GetElementById всегда возвращает ноль? - PullRequest
2 голосов
/ 23 сентября 2010

У меня есть некоторый XML (действительный XHTML), который выглядит следующим образом:

<html>
    <head>
        <script type="text/javascript">
            <![CDATA[
                function change_header(){
                    document.getElementById("myHeader").innerHTML="Nice day!";
                }]]>
        </script>
    </head>
    <body>
        <h1 id="myHeader">Hello World!</h1>
        <button onclick="change_header()">Change text</button>
    </body>
</html>

И я пытаюсь получить узел #myHeader, используя docment.GetElementById("myHeader"), но он всегда возвращает null,Почему?

Я догадываюсь , что он не распознает атрибут id как атрибут id без DTD или чего-то еще?Если это так, как я могу заставить его использовать HTML DTD?

1 Ответ

5 голосов
/ 23 сентября 2010

Это потому, что XmlDocument ничего не знает о том, что означает id. Вам необходимо включить DTD в ваш документ XHTML. Просто поместите следующее в начало вашего HTML-файла:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

Пример:

string html = @"<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Transitional//EN"" ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd""><html><body><div id=""foo"">some content</div></body></html>";
XmlDocument document = new XmlDocument();
document.LoadXml(html);
XmlElement div = document.GetElementById("foo");

Обратите внимание, что это может быть немного медленнее, потому что DTD необходимо загрузить.

...