【问题标题】:Parse XML with repeated pattern of nodes使用重复的节点模式解析 XML
【发布时间】:2011-04-14 01:31:09
【问题描述】:

您能否给我一些关于在 C# 中解析 XML 文档的最佳方法的想法?

<RESPONSE>
  <FNAME>user1</FNAME>
  <LNAME>lastname1</LNAME>
  <ADDRESS>
     <LINE1>line 1 for user 1</LINE1>
     <LINE2>line 2 for user 1</LINE2>
     .....
     .....
  </ADDRESS>
  <FNAME>user2</FNAME>
  <LNAME>lastname2</LNAME>
  <ADDRESS>
     <LINE1>line 1 for user 2</LINE1>
     <LINE2>line 2 for user 2</LINE2>
     .....
     .....
  </ADDRESS>

</RESPONSE>

这是从在线 XML 服务返回的数据,它显然不是很好的格式,因为嵌套没有正确应用于每个不同的元素。有没有办法可以避免逐行解析和文本比较?

【问题讨论】:

  • 您到底想对返回的 XML 做什么?你想解析出哪些元素?
  • 小心。 “格式正确”在 XML 中具有特定含义,并且您的文档 格式正确。见:en.wikipedia.org/wiki/Well-formed_element
  • XPath 从 XML 树中选择 节点(已解析)。重新标记。

标签: c# xml xml-parsing


【解决方案1】:

给你:

XmlTextReader xml = new XmlTextReader("response.xml");
while (xml.Read())
{
    switch (xml.NodeType)
    {
        case XmlNodeType.Element:
            {
                if (xml.Name == "RESPONSE") Console.WriteLine("Response: ");
                if (xml.Name == "FNAME")
                {
                    Console.Write("First Name: ");
                }
                if (xml.Name == "LNAME")
                {
                    Console.Write("Last Name: ");
                }
                if (xml.Name == "ADDRESS") Console.WriteLine("Address: ");
                if (xml.Name == "LINE1")
                {
                    Console.Write("Line 1: ");
                }
                if (xml.Name == "LINE2")
                {
                    Console.Write("Line 2: ");
                }
            }
            break;
        case XmlNodeType.Text:
            {
                Console.WriteLine(xml.Value);
            }
            break;
        default: break;
    }
}
Console.ReadKey();

【讨论】:

  • 我对此表示赞同,因为除了按顺序阅读之外,我真的没有看到将这个 XML 解析为单独对象的方法。就像 OP 所说的那样,XML 的嵌套方式不会使这更容易。
【解决方案2】:

Linq to Xml 是使用 .NET 解析 XML 的现代方式

以下 sn-p 将使您能够访问所有 FNAME 元素

var doc = XDocument.Parse(xml);
foreach (var fname in doc.Root.Elements("FNAME") {
  // fname.Value has the element value
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多