C#linq to xml,带属性的嵌套查询

时间:2012-06-22 10:11:48

标签: c# xml linq

我真的很想弄清楚这一点。

我正在使用c#。

我想从xml文件中获取IEnumerable产品。

以下是xml结构的示例。

我需要获取productEnriched自定义属性设置为true的产品列表。

有些产品根本没有任何自定义属性部分

我的脑袋只是考虑到它而受伤!

<?xml version="1.0" encoding="UTF-8"?>
<catalog xmlns="http://www.mynamespace.com" catalog-id="MvgCatalog">
    <product>
        <custom-attributes>
            <custom-attribute attribute-id="productEnriched">true</custom-attribute>
        </custom-attributes>
    </product>
</category>

感谢您的帮助

为了清楚起见,我在示例xml中添加了一些项目

我需要获得产品清单 只有具有属性productEnriched且值为true的custom-attribute元素的产品 xml中的某些产品不具有任何自定义属性或自定义属性元素 有些产品会有它,但值为false 我只需要一个存在的产品列表,其值为true

<?xml version="1.0" encoding="UTF-8"?>
<catalog xmlns="http://www.mynamespace.com" catalog-id="MvgCatalog">
    <product>
        <upc>000000000000</upc> 
        <productTitle>My product name</productTitle>
        <custom-attributes>
           <custom-attribute attribute-id="productEnriched">true</custom-attribute>
           <custom-attribute attribute-id="somethingElse">4</custom-attribute>
           <custom-attribute attribute-id="anotherThing">otherdata</custom-attribute>
        </custom-attributes>
    </product>
</category>

1 个答案:

答案 0 :(得分:3)

  

我需要获得只有产品的产品列表   custom-attribute元素,其属性为productEnriched和value   真正的一些产品在xml中不会有任何自定义属性或   自定义属性元素,一些产品将拥有它但具有值   我只需要一个存在且具有的产品列表   真值

var xml = XElement.Load(@"your file.xml");
XNamespace ns = "http://www.mynamespace.com";
var products = xml.Elements(ns + "product");
var filtered = products.Where(
    product =>
        product.Element(ns + "custom-attributes") != null &&
        product.Element(ns + "custom-attributes").Elements(ns + "custom-attribute")
        .Any(
            ca => 
                ca.Value == "true" && 
                ca.Attribute("attribute-id") != null && 
                ca.Attribute("attribute-id").Value == "productEnriched"));

顺便提一下,您的XML无效 - 您的开始标记(catalog)与结束标记(category)不匹配。

格式本身很奇怪 - 这是你的想法吗?

    <custom-attributes>
       <custom-attribute attribute-id="productEnriched">true</custom-attribute>
       <custom-attribute attribute-id="somethingElse">4</custom-attribute>
       <custom-attribute attribute-id="anotherThing">otherdata</custom-attribute>
    </custom-attributes>

为什么要将属性名称作为属性值和属性值作为元素值?它看起来很臃肿,并且没有明确的目的“重新发明”XML。

为什么不:

    <custom-attributes>
       <custom-attribute productEnriched="true"/>
       <custom-attribute somethingElse="4"/>
       <custom-attribute anotherThing="otherdata"/>
    </custom-attributes>

或者:

    <custom-attributes productEnriched="true" somethingElse="4" anotherThing="otherdata"/>

或者只是使用元素:

    <product-parameters>
       <productEnriched>true</productEnriched>
       <somethingElse>4</somethingElse>
       <anotherThing>otherdata</anotherThing>
    </product-parameters>