Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Linq解析格式错误的XML_C#_.net_Xml_Winforms_Linq - Fatal编程技术网

C# 使用Linq解析格式错误的XML

C# 使用Linq解析格式错误的XML,c#,.net,xml,winforms,linq,C#,.net,Xml,Winforms,Linq,我正在尝试解析一些我认为在.NET3.5中使用Linq格式不正确的xml,我需要从xml中获取数据并将数据插入变量,我一直在使用XmlDocument解析xml,非常感谢任何示例或帮助 XML-- 你的LINQ错了。您正在查找名为name的元素。你没有。您的元素名为字段 ETA:好的,我现在重做这个,因为我已经更好地了解了您的XML var query = from r in xml.Elements("row") select r; 您还需要查看Att

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

XML--


你的LINQ错了。您正在查找名为
name
的元素。你没有。您的元素名为
字段

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));
}

下面的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"]);

下面的代码将以您希望的方式解析XML。请注意,如果XML中有任何特殊字符,XElement在加载XML时可能会抛出异常。在尝试解析字符串之前,您可能需要对其进行预处理,以正确转义这些字符。还要注意,它不喜欢第二行元素和空字段元素。如果希望从源代码中获得类似的内容,则必须编写一些错误处理来查找它或捕获异常并转储整行

提供的XML格式并不糟糕,但它相当奇怪——每个字段的名称应该是元素的名称,而不是元素的属性。这使得解析它有点困难。它使用子代跳过其他元素,直接获取文件中的所有行元素。然后使用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));
}

是否包含XML示例?它没有出现(至少对我来说不是)。LINQtoXML假设有效的XML-它不能处理格式错误的XML。您发布的XML格式正确。有什么问题吗?我确实包含了xml,但我做了一些编辑才使它真正出现。这并不意味着它的格式不正确。发布你的LINQ并解释你预期不会发生的事情。Ann,我也有同样的想法,并尝试更改为“field”,但没有结果,我也尝试了“data”、“row”、“name”和“centovacast”,因为某些原因,没有任何结果……我添加了更多的代码——这是我想到的,可能是错误的,因为我假设您有一个父元素,而您可能有几个。我会把它修好的。埃塔:好的,修好了。不过,请记住,我是从内存中执行的,可能会混淆方法名称。安,这段代码看起来很棒,我非常感谢您的帮助,但是qe.Attributes[“”].Value在我尝试编译它时出错--无法将带[]的索引应用于“method group”类型的表达式(我告诉过您它来自内存!)尝试
qe.Attributes(“任意”)
。如果不起作用,请在文档中查找
属性
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"]);
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));
}