Linq2XML Query проблема (не принимает ':' в именах) - PullRequest
0 голосов
/ 12 августа 2010

У меня есть XML-файл, который имеет следующие элементы:

<rs:data>
<z:row entry='*.@foo.de' type='1'/>

Мне нужно получить к ним доступ, используя Linq2Xml. Моя проблема в том, что я получаю исключение, которое говорит мне что знак ':' нельзя использовать в именах.

Мой запрос Linq2Xml:

var rowQuery = from Mail in whiteMails.Descendants("xml").Descendants("rs:data").Descendants("z:row")
                       select Mail;

Как я могу справиться с этим?

1 Ответ

1 голос
/ 13 августа 2010

rs: data - это имя элемента, который принадлежит пространству имен. «Rs» - это префикс пространства имен, «data» - локальное имя. В соответствии с вашим комментарием выше префикс rs объявлен для URI пространства имен «urn: schemas-microsoft-com: rowset». Это означает, что ваш элемент идентифицируется как элемент с локальным именем «data» и URI пространства имен «urn: schemas-microsoft-com: rowset». В LINQ to XML все имена должны быть полностью определены по их пространству имен (это также, как XML работает в целом). В коде это делается с использованием классов XNamespace и XName. Так, например:

XNamespace rsNamespace = XNamespace.Get("urn:schemas-microsoft-com:rowset");
XNamespace zNamespace = XNamespace.Get("#RowsetSchema");
var rowQuery = from Mail in whiteMails.Elements("xml")
                                      .Elements(rsNamespace + "data")
                                      .Elements(zNamespace + "row")
               select Mail;

Обратите внимание, что я использовал элементы вместо потомков. (Потомки тоже будут работать). Потомки вернут вам все элементы с указанным именем во всем поддереве элемента, на котором вы их вызываете - на любой глубине. Элементы вернут только всех непосредственных потомков с этим именем. Из вашего XML и запроса кажется, что вы хотите непосредственных детей. Кроме того, Elements намного быстрее, чем Descendants, поскольку ему нужно пройти только по непосредственным дочерним элементам, а не по всему поддереву.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...