1

私は次のXMLを持っています

<?xml version="1.0" encoding="UTF-8"?>
<xmlarchivefieldlist archive_schema="47800727">
   <client key_id="47800731"  str_label="Customer" str_type="select" invoice="1"/>
   <brand key_id="47800734" str_label="BrandName" str_type="text" invoice="2"/>
   <product key_id="47800730" str_label="Product" str_type="text" invoice="3"/>
</xmlarchivefieldlist>

XDocument にドキュメントがあります。

属性値しかわからない場合に要素名を見つけるにはどうすればよいですか。

たとえば、私は str_label="Customer" を知っているので、返してほしい:- client. たとえば、私は str_type="text" を知っているので、返してほしい:- ブランド、製品。

4

5 に答える 5

3

XPath で LINQ to XML を使用して、属性値で要素を取得できます。

var xdoc = XDocument.Load(path_to_xml);
var names = xdoc.XPathSelectElements("//*[@str_label='Customer']")
                .Select(e => e.Name);

または、ラムダ構文を使用できます。

string attrName = "str_type";
string attrValue = "text";
var names = xdoc.Descendants()
                .Where(e => (string)e.Attribute(attributeName) == attrValue)
                .Select(e => e.Name);

ところで:連結された文字列を名前で取得するには、String.Joinを使用できます:

var result = String.Join(",", names);
于 2013-11-04T15:25:59.247 に答える
0

Xpath:

name(//node()[@str_label='顧客'][1])

ノード名「クライアント」を返します

于 2013-11-04T15:33:02.930 に答える
0

ルート要素が<xmlarchivefieldlist>あり、探している要素がその子であることがわかっている場合は、次のようにできます。

var customer = doc.Element("xmlarchivefieldlist").Elements()
            .FirstOrDefault(x => x.Attribute("str_label").Value == "Customer");
Console.WriteLine(customer);
<client key_id="47800731" str_label="Customer" str_type="select" invoice="1" />

一致する子孫要素をより一般的に探すには、次のようにします。これは、上記とは異なり、対象の要素がstr_label属性を持つ必要はありません。

var customer = doc.Descendants()
            .FirstOrDefault(x => (string)x.Attribute("str_label") == "Customer");
Console.WriteLine(customer);
于 2013-11-04T15:29:23.697 に答える
0

あなたがしたい.Attribute("str_label").Value

何かのようなもの:

var filter = xDoc.Descendents("xmlarchivefieldlist").Where(x => (string)x.Attribute("str_label") == "Customer");
于 2013-11-04T15:24:05.497 に答える