如何在C#中解析没有特定标记名称的XML

时间:2012-06-27 10:40:18

标签: c# xml xml-parsing

我有以下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_”由字符串表示。如果你能帮助我,我会非常感激。

5 个答案:

答案 0 :(得分:1)

首先,创建一个xml document对象。然后获取根节点,然后访问您的自定义节点。

    XmlDocument doc = new XmlDocument();
    doc.Load(fileName);
    XmlNode root = doc.DocumentElement;
    XmlNode s = root.SelectSingleNode('/' + rootName + '/' + section);

答案 1 :(得分:0)

看一下XmlDocument,你可以递归迭代ChildNodes属性。

e.g。

void Recurse(XmlNodeList list)
{ 
     foreach(XmlNode node in list)
     {
         // Do some work
         Recurse(node.ChildNodes);
     }
}

答案 2 :(得分:0)

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

我想补充一点,在XML文件非常大的情况下(因此一次在内存中读取它是不切实际的),有一个XmlReader类,它允许你从开始到结束顺序读取XML文件,只在内存中保留一小部分。

答案 3 :(得分: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,您的项目可能不需要它们。

答案 4 :(得分:-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");
 }