3

C# コードで解析したい次の XML があります。ただし、これをどのように行うべきかはわかりません。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<results>
  <fields>
    <field>COLUMN_NAME_1</field>
    <field>COLUMN_NAME_2</field>
    <field>COLUMN_NAME_3</field>
    <field>COLUMN_NAME_4</field>
  </fields>
  <rows>
    <row>
      <col>value_for_column_1</col>
      <col>value_for_column_2</col>
      <col>value_for_column_3</col>
      <col>value_for_column_4</col>
    </row>
    <row>
      <col>value_for_column_1</col>
      <col>value_for_column_2</col>
      <col>value_for_column_3</col>
      <col>value_for_column_4</col>
    </row>
    ...
  </rows>
</results>

実際のデータを提供できないため、これは単なる例です。XML の構造はまったく同じに見えます。「COLUMN_NAME_」と「value_for_column_」は文字列で表されます。あなたが私を助けることができれば、私はとても感謝しています.

4

5 に答える 5

1

まず、xml ドキュメントオブジェクトを作成します。次にルート ノードを取得し、カスタム ノードにアクセスします。

    XmlDocument doc = new XmlDocument();
    doc.Load(fileName);
    XmlNode root = doc.DocumentElement;
    XmlNode s = root.SelectSingleNode('/' + rootName + '/' + section);
于 2012-06-27T10:50:51.907 に答える
0

他の人が指摘しているように、XmlDocumentは、そのようなファイルを読むための最も快適な方法の 1 つです。を使用してノードを反復処理したりforeach、ノードに対して XPath クエリを実行したりできます。

XMLファイルが非常に大きい場合(したがって、メモリ内のすべてを一度に読み取るのは非現実的です)、XmlReaderクラスがあり、XMLファイルを順番に読み取ることができます。最初から最後まで、そのごく一部のみをメモリに保持します。

于 2012-06-27T10:51:08.160 に答える
0

以下を使用して、フィールド要素と行要素を取得できます。

  • node.FirstNode- 親の最初の子ノードを取得する
  • node.NextNode- 次の兄弟ノードを取得します

xml をロードし、列リストを初期化します。

XElement root = XElement.Load(file); // or .Parse(string);
List<List<string>> columns = new List<List<string>>();

列ヘッダーを取得します。

XElement fields = (XElement)root.FirstNode;
fields.Elements().Select((x, i) => 
{
    columns.Add(new List<string>());
    columns[i].Add((string)x); 
    return true; // because a select has to return something
}).ToArray();

次に、行を取得します。

XElement rows = (XElement)fields.NextNode;
rows.Elements().ToList().ForEach(row =>
    row.Elements().Select((x, i) => 
    { 
        columns[i].Add((string)x); 
        return true; 
    }).ToArray());

列リストには、列ごとにソートされたすべての行が続くヘッダーが含まれます。

PS私は.ToArray()'s私のテストのために必要でした.あなたのプロジェクトではそれらを必要としないかもしれません.

于 2012-06-27T14:49:47.423 に答える
0

を見てください。プロパティを再帰的XmlDocumentに反復処理できます。ChildNodes

例えば

void Recurse(XmlNodeList list)
{ 
     foreach(XmlNode node in list)
     {
         // Do some work
         Recurse(node.ChildNodes);
     }
}
于 2012-06-27T10:46:34.567 に答える
-1

Here is the simpliest way to do this:

 private static void Main()
 {
        const string xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?> <results> ... </results>";
        XmlDocument doc = new XmlDocument();

        doc.LoadXml(xml);
        var fieldsCollection  = doc.GetElementsByTagName("fields");
        var rowsCollection = doc.GetElementsByTagName("rows");
 }
于 2012-06-27T10:43:55.487 に答える