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 を持つ custom-attribute 要素を持ち、値が true の製品のみのリストを取得する必要があります。xml 内の一部の製品には、custom-attribute または custom-attributes 要素がありませんが、値を持つ製品もあります。 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>
4

1 に答える 1

3

productEnriched属性を持つcustom-attribute要素を持つ製品のみの製品のリストを取得する必要があります。xml内の一部の製品にはcustom-attributeまたはcustom-attributes要素がありませんが、値を持つ製品もあります。 falseの場合、存在し、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 に答える