Простой вопрос о LINQ to XML - PullRequest
0 голосов
/ 21 июня 2010
<root xmlns:h="http://www.w3.org/TR/html4/"
      xmlns:f="http://www.w3schools.com/furniture">

<h:table>
  <h:tr>
    <h:td>Apples</h:td>
    <h:td>Bananas</h:td>
  </h:tr>
</h:table>

<f:table>
  <f:name>African Coffee Table</f:name>
  <f:width>80</f:width>
  <f:length>120</f:length>
</f:table>

</root>

Я пытаюсь попрактиковаться в LinqToXml, но не могу понять, чего я хотел. Просто как я могу запросить элементы таблицы, которые имеют пространство имен h или f?Это было то, что я пытался. Также я пробовал разные, но не работал.

var query = from item in XDocument.Parse(xml).Elements(ns + "table")
            select item;

Ответы [ 2 ]

5 голосов
/ 21 июня 2010

Это не сработает, потому что в вашем запросе отсутствует элемент root.Это будет работать:

XNamespace ns = "http://www.w3schools.com/furniture";
var query = XDocument.Parse(xml).Element("root").Elements(ns + "table");

Теперь, если проблема в том, что вы хотите найти все"табличных" элементов независимо от пространства имен, вам нужно что-токак это:

var query = XDocument.Parse(xml)
                     .Element("root")
                     .Elements()
                     .Where(element => element.Name.LocalName == "table");

(РЕДАКТИРОВАТЬ: Как уже отмечалось, вы можете использовать XDocument.Root, чтобы добраться до корневого элемента, если вы хотите. Важным моментом является то, что попытка получить к элементу table напрямуюиз самого документа узел не будет работать.)

2 голосов
/ 21 июня 2010

Префиксы пространства имен не обязательно должны быть конкретной буквой или строкой. Наилучшим подходом будет поиск по квалифицированному пространству имен.

Это получит все прямые дочерние узлы XElement xml, где пространство имен равно uri:namespace ...

var selectedByNamespace = from element in xml.Elements()
                          where element.Name.NamespaceName == "uri:namespace"
                          select element;

Другим вариантом будет выбор элементов на основе полностью определенного имени.

var ns = "{uri:namespace}";
var selectedElements = xml.Elements(ns + "table");
...