下降到XML属性

时间:2012-04-03 13:48:59

标签: c# xml silverlight xpath linq-to-xml

我可能对此感到生气,并且必须有一些微不足道的错误。我试图从这个XML代码中获取每个属性Name == Eyes的“Value”属性。

        <?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);
}

事实证明,如果我修改了一个手表,那么在调用方法之前该对象为null:

x.Element( “LongString”)属性( “值”)值。;

我知道这可能是我在遍历XML时遗漏的东西,但我不知道为什么它结果为null,因为如果我尝试一个愚蠢的监视(x.Value)那么它不是null。

2 个答案:

答案 0 :(得分:1)

已经有一段时间了,因为我已经有了使用命名空间处理xml的乐趣,但你是否必须为每个查询添加命名空间?即在你的循环中?

答案 1 :(得分:1)

LongString元素位于http://schemas.microsoft.com/collection/metadata/2009架构中,因此您也需要它:

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

基本上,如果某个元素的祖先某处有一个xmlns="..."属性,则该元素被视为元素的默认命名空间(更深层的元素会覆盖较浅的元素)。

(请注意,此默认不会与属性一起发生。)