Поиск элементов с несколькими пространствами имен - PullRequest
0 голосов
/ 04 апреля 2011

У меня проблемы с поиском элементов в файле XML с использованием LINQ to XML в C # 4.0.

Вот упрощенная XML-схема:

<?xml version="1.0" encoding="utf-8"?>
<mDoc xmlns="http://schemas.microsoft.com/taxonomy/2003/1">
    <content>
        <gdsPage xmlns="http://mysite.com/schemas/gdsPage/1/">
            <textContainer id="C_134572">
                <text id="T_399231">Content</text>
                <text id="T_399232">Content</text>
            </textContainer>
            <textContainer id="C_134607" brands="PRMR " did="1" renderOption="" needceiling="0">
                <text id="T_399268">Content</text>
            </textContainer>
        </gdsPage>
    </content>
</mDoc>

Обратите внимание на два отдельных пространства имен, определенных в этом документе.

Я определяю их в своем коде следующим образом:

XNamespace ns_mdoc = "http://schemas.microsoft.com/taxonomy/2003/1";
XNamespace ns_gds = "http://mysite.com/schemas/gdsPage/1/";

Тогда из того, что я понимаю, я смогу предварительно добавить пространство имен к элементу, чтобы найти его, вот так:

var query =
                from links in
                    xdoc.Element(ns_gds + "linkContainer").Elements("link")
                where links.Attribute("id").Value == "C_134608" || links.Attribute("id").Value == "L_233140"
                select links;

Это возвращает ноль. Я пробовал много других комбинаций аксессоров, таких как поиск Axis и потомки:

var stuff = from links in xdoc.Descendants(ns_gds + "linkContainer")
                        select new {
                            link = links.Element(ns_gds + "link").Value
                        };

Я также пытался использовать оба пространства имен, одно затем другое. Все еще Нул.

Что мне здесь не хватает?

Спасибо, что заглянули.

1 Ответ

1 голос
/ 04 апреля 2011

Несколько проблем здесь:

  1. Ваш XML не содержит элементов linkContainer или link - они называются textContainer и text.

  2. Также вы должны использовать Descendands(), а не Elements(), если дочерние узлы, к которым вы хотите получить доступ, не являются прямыми дочерними элементами.

  3. Необходимо установитьпространство имен для всех элементов в вашем запросе, которые находятся под этим пространством имен - вам не хватает пространства имен в Elements("link") части.

с этим XML:

<?xml version="1.0" encoding="utf-8"?>
<mDoc xmlns="http://schemas.microsoft.com/taxonomy/2003/1">
  <content>
    <gdsPage xmlns="http://mysite.com/schemas/gdsPage/1/">
      <textContainer id="C_134572">
        <text id="T_399231">Content</text>
        <text id="T_399232">Content</text>
      </textContainer>
      <textContainer id="C_134607" brands="PRMR " did="1" renderOption="" needceiling="0">
        <text id="T_399268">Content</text>
      </textContainer>
    </gdsPage>
  </content>
</mDoc>

это работает для меня:

var query =  from links in xdoc.Descendants(ns_gds + "textContainer")
                               .Elements(ns_gds + "text")
             where links.Attribute("id").Value == "T_399268" ||
                   links.Attribute("id").Value == "L_233140"
             select links;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...