Xml.Linq: Descendants () ничего не возвращает - PullRequest
4 голосов
/ 21 сентября 2011

Я пытаюсь прочитать файл ncx (т.е. файл xml), используя XElement:

XElement foundNode = ncx.Descendants("navPoint").Where(r => r.Attribute("class").Value == "chapter").FirstOrDefault();

В результате значение foundNode равно нулю, поскольку ncx.Descendants ("navPoint") возвращает пустое перечисление. Но данные есть:

<?xml version='1.0' encoding='utf-8'?>
<ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1" xml:lang="en">
  <head>
    <meta content="8eab2efe-d584-478a-8c73-1304d2ae98fa" name="dtb:uid"/>
    <meta content="3" name="dtb:depth"/>
    <meta content="calibre (0.8.12)" name="dtb:generator"/>
    <meta content="0" name="dtb:totalPageCount"/>
    <meta content="0" name="dtb:maxPageNumber"/>
  </head>
  <docTitle>
    <text>Fine</text>
  </docTitle>
  <navMap>
    <navPoint class="chapter" id="27665f37-ecf5-4934-a044-4f77152e54d9" playOrder="1">
      <navLabel>
        <text>I. BLIND</text>
      </navLabel>
      <content src="Fine_split_003.html"/>

Не могли бы вы объяснить, что здесь не так? Спасибо.

Ответы [ 2 ]

11 голосов
/ 21 сентября 2011

Необходимо учитывать пространство имен в XML:

XDocument ncx = XDocument.Load("file.xml");
XNamespace df = ncx.Root.Name.Namespace;
XElement foundNode = ncx.Descendants(df + "navPoint").Where(r => r.Attribute("class").Value == "chapter").FirstOrDefault();
3 голосов
/ 23 сентября 2011

Вы также можете удалять пространства имен или ссылаться на элементы, не используя пространство имен, используя свойство XElement.Name.LocalName: Примеры здесь

...