3

我有以下 XML,我想在我的 C# 代码中对其进行解析。但是,我不知道该怎么做。

<?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遍历属性。ChildNodes

例如

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

正如其他人所指出的,XmlDocument是读取此类文件的最舒适的方法之一。您可以使用 遍历节点foreach,可以针对它运行 XPath 查询等。

我想补充一点,如果 XML 文件非常大(因此一次在内存中读取它是不切实际的),有一个XmlReader类,它允许您从顺序读取 XML 文件从头到尾,只保留一小部分在内存中。

于 2012-06-27T10:51:08.160 回答
0

通过使用以下内容,我们可以获得 fields 元素和 rows 元素:

  • 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 回答
-1

这是执行此操作的最简单方法:

 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 回答