2

以下の形式のxmlがあります。

<rows>
   <rows>
      <primitiveValue>000</primitiveValue>
   </rows>
   <rows>
      <primitiveValue>58316</primitiveValue>
   </rows>
   <rows>
   <primitiveValue>133083.0</primitiveValue>
   </rows>
</rows>
<rows>
  <rows>
    <primitiveValue>001</primitiveValue>
  </rows>
  <rows>
    <primitiveValue>66018</primitiveValue>
  </rows>
  <rows>
    <primitiveValue>172546.0</primitiveValue>
  </rows>
</rows>

行の親要素ごとにデータを分割する必要がありますが、これを行う方法がわかりません。

以下のコードを試してみましたが、これは行のすべてのインスタンスをループし、重複を引き起こします。

        string Values = "";

        foreach (XElement element in xDoc.Descendants("rows"))
        {

            foreach (XElement childElement in element.Descendants("rows").Elements("primitiveValue"))
            {

                Values = Values + "," + childElement.Value.ToString();

            }


        }

誰か助けてくれませんか?

4

2 に答える 2

1

子孫は、探している名前を持つすべてのノードを、それらが XML ツリーのどこまで下にあるかに関係なく見つけます。次のようなことを試してみてください。

foreach (XElement element in xDoc.Children("rows"))
        {
            foreach (XElement childElement in element.Descendants("rows").Elements("primitiveValue"))
            {
                Values = Values + "," + childElement.Value.ToString();
            }
        }

重要なのは、Children を使用すると、XML ドキュメントの構造全体で一致する要素を検索するのではなく、ルート要素のすぐ下にあるノードのみが返されることです。

于 2013-01-17T20:01:13.997 に答える
0

非常に簡単System.Xml.XPath.Extensionsです:

var values = xdoc.XPathSelectElements(@"//rows/rows/primitiveValue").Select(v => (double)v);
string result = String.Join(",", values);

値にはIEnumerable<double>、primitiveValue 要素の値が含まれます。結果は、すべての値の連結文字列になります。ところで、xml にルート要素がありません。

アップデート

IEnumerable<string> result = 
             xdoc.Root.Elements("rows")
                 .Select(r => String.Join(",", r.Descendants("primitiveValue")
                                                .Select(v => (double)v)));

これは一連の文字列を返し、各文字列には内部行の連結値が含まれます。double 値ではなく生の文字列が必要な場合は、値ノードを文字列にキャストします。

于 2013-01-17T20:14:32.657 に答える