2

我正在尝试解析一些我认为在 .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")));
        }
4

3 回答 3

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));
}
于 2012-10-24T18:54:23.933 回答
0

下面的 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"]);
于 2012-10-24T19:16:27.660 回答
0

以下代码将以您想要的方式解析 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-10-24T19:27:54.037 回答