4

我真的很难理解这一点。

我正在使用 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假的我只需要它存在并且值为真的产品列表

<?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>
4

1 回答 1

3

我需要获取产品列表,只有产品具有自定义属性元素,属性为 productEnriched,值为 true假的我只需要它存在并且值为真的产品列表

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>
于 2012-06-22T10:21:46.030 回答