Спуск в XML-атрибуты - PullRequest
       28

Спуск в XML-атрибуты

0 голосов
/ 03 апреля 2012

Я, наверное, злюсь на это, и в этом должна быть какая-то тривиальная ошибка.Я пытаюсь получить из этого XML-кода атрибуты «Значение» для каждого атрибута Имя == Глаза.

        <?xml version="1.0" encoding="utf-8"?>
<Collection xmlns:p="http://schemas.microsoft.com/livelabs/pivot/collection/2009" SchemaVersion="1.0" Name="Actresses" xmlns="http://schemas.microsoft.com/collection/metadata/2009">
  <FacetCategories>
    <FacetCategory Name="Nationality" Type="LongString" p:IsFilterVisible="true" p:IsWordWheelVisible="true" p:IsMetaDataVisible="true" />
    <FacetCategory Name="Eyes" Type="LongString" p:IsFilterVisible="true" p:IsWordWheelVisible="true" p:IsMetaDataVisible="true" />
  </FacetCategories>
  <Items ImgBase="Actresses_files\go144bwo.0ao.xml" HrefBase="http://www.imdb.com/name/">
    <Item Id="0" Img="#0" Name="Virginie Ledoyen" Href="nm0001461/">
      <Description> blablabla blablabla  blablabla blablabla  blablabla blablabla  blablabla blablabla  blablabla blablabla  blablabla blablabla  blablabla blablabla  blablabla blablabla </Description>
      <Facets>
        <Facet Name="Nationality">
          <LongString Value="French" />
        </Facet>
         <Facet Name="Eyes">
          <LongString Value="Blue" />
        </Facet>

      </Facets>
    </Item>
    <Item Id="1" Img="#1" Name="Meiko Kaji" Href="nm0435299/">
      <Description> blablabla blablabla  blablabla blablabla  blablabla blablabla  blablabla blablabla  blablabla blablabla  blablabla blablabla  blablabla blablabla  blablabla blablabla </Description>

      <Facets>
        <Facet Name="Nationality">
          <LongString Value="Japanese" />
        </Facet>
        <Facet Name="Eyes">
          <LongString Value="Black" />
        </Facet>
      </Facets>      
    </Item>

  </Items>
</Collection>

Мне нужно заполнить комбинированный список этими атрибутами.Мой код выглядит примерно так:

XNamespace fix = "http://schemas.microsoft.com/collection/metadata/2009";
IEnumerable<XElement> list2 =
                    from item in document.Descendants(fix + "Facet")
                    where (string)item.Attribute("Name") == "Eyes"
                    select item;
foreach (XElement x in list2)
{
this.comboBox2.Items.Add(x.Element("LongString").Attribute("Value").Value);
}

Оказывается, объект является нулевым, прежде чем вызывать метод, если я фиксирую часы:

x.Element ("LongString"). Атрибут( «Значение») Значение.

Я знаю, что это, вероятно, что-то, чего мне не хватает при обходе XML, но я не знаю, почему он оказывается нулевым, поскольку, если я попробую тупые часы на (x.Value), то это не будет нулевым.

Ответы [ 2 ]

1 голос
/ 03 апреля 2012

Элемент LongString находится в схеме http://schemas.microsoft.com/collection/metadata/2009, поэтому вам это также необходимо:

this.comboBox2.Items.Add(x.Element(fix + "LongString")
                          .Attribute("Value").Value);

По сути, если где-то в предке элемента есть атрибут xmlns="...", он берется в качестве пространства имен по умолчанию для элемента (более глубокие переопределяют более мелкие).

(Обратите внимание, что по умолчанию не встречается с атрибутами.)

1 голос
/ 03 апреля 2012

Прошло много времени с тех пор, как я имел удовольствие работать с xml с пространствами имен, но нужно ли добавлять пространство имен к каждому запросу? то есть в вашей петле?

...