使用Xml.Linq处理相同数据的不同xml格式;

时间:2014-08-12 16:35:36

标签: xml c#-4.0 linq-to-xml

我有所有这些XML记录都是用两种样式编写的,它们都包含相同的信息。

我是LinQ的新手,但我认为这个表达式只会使用name属性。但它失败并返回true。

/* the failed query for the first Xml document */
/* I believed this said, find anything with a name attribute and return it's value */
public XDocument MyDocument= new XDocument().Load("this.xml");
List<string> allNames = MyDocument.Descendants()
    .Where( a => a.Attribute("name") != null )
    .Select( a => a.Value ).toList();

这是xml的两个版本

<RecListImgx>
    <locale id="1033" />
    <IMGPAK>
        <img name="1033sm.jpg"/>
        <img name="1033m.jpg"/>
        <img name="1033r.jpg"/>
        <img name="1033l.jpg"/>
    </IMGPAK>
</RecListImgx>


<RecListImgx>
    <locale id="1033" />
    <IMGPAK>
        <img>
           <name> 1033sm.jpg </name>
        </img>
        <img>
           <name> 1033s.jpg </name>
        </img>
        <img>
           <name> 1033m.jpg </name>
        </img>
        <img>
           <name> 1033l.jpg </name>
        </img>
    </IMGPAK>
</RecListImgx>

1。是否有一个查询可以从这两种XML样式中获取name字段?
2。解析第一种类型的正确语法是什么? 我设法导航第二种形式就好了。但内联属性似乎无法找到名称属性 3。这些格式有何不同?

1 个答案:

答案 0 :(得分:2)

  

是否有一个查询可以从这两种XML样式中获取名称字段?

List<string> allNames = MyDocument.Descendants("img")
    // Look for a name attribute first; if there isn't one, find the name
    // element instead.
    .Select(a => (string) a.Attribute("name") ?? a.Element("name").Value)
    .ToList();
  

解析第一种类型的正确语法是什么?我设法导航第二种形式就好了。但内联属性似乎无法找到名称属性。

您正在查找具有name属性的所有元素 - 但随后选择元素的值,而不是属性的值。见上文。

  

这些格式有什么不同?

一个有name子元素,其值为文本节点,而另一个有name属性,值为属性值。