【问题标题】:Parse Malformed XML With Linq使用 Linq 解析格式错误的 XML
【发布时间】:2012-10-24 18:43:04
【问题描述】:

我正在尝试解析一些我认为在 .net 3.5 中使用 Linq 格式错误的 xml,我需要从 xml 中获取数据并将数据插入到变量中,我一直在使用 XmlDocument 来解析 xml,非常感谢任何示例或帮助

XML --

<?xml version="1.0" encoding="UTF-8"?>
<centovacast version="2.2.4" host="my.domain.com">
<response type="success">
<message>Complete</message>
<data><row>
<field name="mount">/stream</field>
<field name="listenercount">0</field>
<field name="genre">Unspecified</field>
<field name="url">http://</field>
<field name="title"></field>
<field name="currentsong">Placebo - One Of A Kind</field>
<field name="bitrate">128</field>
<field name="sourceconnected">1</field>
<field name="serverstate">1</field>
<field name="sourcestate">1</field>
<field name="reseller">0</field>
<field name="ipaddress"></field>
<field name="port">13282</field>
<field name="proxy">0</field>
<field name="servertype">ShoutCast</field>
<field name="sourcetype">icescc</field>
</row><row><field></field></row></data></response></centovacast>

另一个问题是有时“currentsong”值可能包含特殊字符,例如! , % , ^ & 等等,我知道这有时会导致 xml 出现问题。

-- 我试图用来解析 XML 的代码

        XElement xml = XElement.Parse(data);

        var query = from p in xml.Elements("name")
                    select p;

        foreach (var record in query)
        {
            MessageBox.Show(String.Format("Info: {0} {1}",
                                                record.Element("url"),
                                                record.Element("title")));
        }

【问题讨论】:

  • 您是否包含了 XML 示例?它没有出现(至少对我来说没有)。
  • LINQ to XML 假定 XML 有效 - 它无法处理格式错误的 XML。
  • 您发布的 XML 格式正确。有什么问题?
  • 我确实包含了 xml,但我需要进行一些编辑才能让它真正出现。
  • 这不会使其格式错误。发布您的 LINQ 并解释您期望发生的事情并没有发生。

标签: c# .net xml winforms linq


【解决方案1】:

您的 LINQ 错误。您正在寻找一个名为name 的元素。你没有。您有名为field 的元素。

ETA:好的,现在我正在重做这个,因为我可以更好地查看您的 XML。

  var query = from r in xml.Elements("row") 
                select r; 

您还需要查看 Attributes 集合,因为这就是 name 的含义:一个属性。以下内容来自记忆,但看起来像这样:

foreach(XElement row in query)
{
    var urlElement = row.Elements("field").Single(qe=>qe.HasAttributes && qe.Attribute("name").Value == "url");
    var titleElement = row.Elements("field").Single(qe => qe.HasAttributes && qe.Attribute("name").Value == "title");
    MessageBox.Show(String.Format("Info: {0} {1}", urlElement.Value, titleElement.Value));
}

【讨论】:

  • 安,我也有同样的想法并尝试更改为“字段”但没有结果,我还尝试了“数据”、“行”、“名称”和“centovacast”,由于某种原因没有产生任何结果任何结果..
  • 我添加了一些代码——在我看来,这可能是错误的,因为我假设你有一个父元素,而你可能有几个。我会修复它。 ETA:好的,已修复。但请记住,我是凭记忆这样做的,可能会混淆方法名称。
  • ann,这段代码看起来很棒,我真的很感谢你的帮助,但是当我尝试编译它时 qe.Attributes[""].Value 会抛出一个错误 -- 无法使用 [] 来应用索引“方法组”类型的表达式
  • 我告诉过你这是凭记忆! :) 试试qe.Attributes("whatever")。如果这不起作用,请在文档中查找 Attributes
【解决方案2】:

下面的 Linq2Xml 代码适用于您的 xml。

var xDoc = XDocument.Parse(xml); //XDocument.Load(filename)

var dict = xDoc.Descendants("field")
               .Where(e=>e.HasAttributes)
               .ToDictionary(e => e.Attribute("name").Value, e => e.Value);

Console.WriteLine(dict["currentsong"]);

【讨论】:

    【解决方案3】:

    以下代码将以您想要的方式解析 XML。请注意,如果 XElement 在其中包含任何特殊字符,则您可能会遇到 XElement 在加载 XML 时引发异常的问题。在尝试解析字符串之前,您可能需要预处理字符串以正确转义这些字符。另请注意,它不喜欢带有空字段元素的第二行元素。如果您希望从源代码中获得类似的信息,则必须编写一些错误处理程序来找到它或捕获异常并转储整行。

    提供的 XML 格式不差,但有点奇怪 - 每个字段的名称应该是元素的名称,而不是它的属性。这使得解析它有点棘手。这使用 Descendents 跳过其他元素并直接获取文件中的所有行元素。然后使用 Linq First 方法查找具有所需属性值的元素并从中获取元素值。

    var query = from p in xml.Descendants("row")
                        select p;
    
    foreach (var record in query)
    {
        MessageBox.Show(String.Format("Info: {0} {1}",
            record.Elements().First(e => e.Attribute("name").Value.Equals("url")).Value,
            record.Elements().First(e => e.Attribute("name").Value.Equals("title")).Value));
    }
    

    【讨论】:

      猜你喜欢
      • 2012-05-20
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多