XDocument没有返回任何值

时间:2014-08-05 07:02:52

标签: c# xml linq-to-xml

我正在从文件中读取一些XML。在文件中,XML存储为一行文本,如下所示:

<ArrayOfKeyValueOfstringanyType xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays"><KeyValueOfstringanyType><Key>askforreview</Key><Value xmlns:d3p1="http://www.w3.org/2001/XMLSchema" i:type="d3p1:boolean">false</Value></KeyValueOfstringanyType><KeyValueOfstringanyType><Key>started</Key><Value xmlns:d3p1="http://www.w3.org/2001/XMLSchema" i:type="d3p1:int">1</Value></KeyValueOfstringanyType><KeyValueOfstringanyType><Key>LastRunVersion</Key><Value xmlns:d3p1="http://www.w3.org/2001/XMLSchema" i:type="d3p1:int">148</Value></KeyValueOfstringanyType> ... etc

我正在使用StreamReader读取文件,并调用XDocument.Load。使用调试中的代码,如果我转储了XDocument的变量,Visual Studio会以格式化的方式打印出XML,这表明XDocument已正确解析了单行文本:

<ArrayOfKeyValueOfstringanyType xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
  <KeyValueOfstringanyType>
    <Key>askforreview</Key>
    <Value xmlns:d3p1="http://www.w3.org/2001/XMLSchema" i:type="d3p1:boolean">false</Value>
  </KeyValueOfstringanyType>
  <KeyValueOfstringanyType>
    <Key>started</Key>
    <Value xmlns:d3p1="http://www.w3.org/2001/XMLSchema" i:type="d3p1:int">1</Value>
  </KeyValueOfstringanyType>
  <KeyValueOfstringanyType>
    <Key>LastRunVersion</Key>
    <Value xmlns:d3p1="http://www.w3.org/2001/XMLSchema" i:type="d3p1:int">148</Value>
  </KeyValueOfstringanyType>

etc

但是,尝试提取元素,后代,值等几乎都会导致返回null。我担心的是,如果我调用.Root,我再次显示所有XML,以及:

FirstAttribute: {xmlns:i="http://www.w3.org/2001/XMLSchema-instance"}
HasAttributes: true
HasElements: true
IsEmpty: false
LastAttribute: {xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays"}
Name: {{http://schemas.microsoft.com/2003/10/Serialization/Arrays}ArrayOfKeyValueOfstringanyType}
NodeType: Element
Value: "askforreviewfalsestarted1LastRunVersion148 ... etc"

换句话说,看起来所有的值都是一起运行的?

更新:我一直在尝试做的事情的清晰度......

鉴于关于命名空间的建议,我试过这个:

oldSettings = XDocument.Load(sr);
XNamespace f ="http://schemas.microsoft.com/2003/10/Serialization/Arrays";
XElement f1 = oldSettings.Element(f + "KeyValueOfstringanyType");

(请原谅var名称 - 这只是在立即窗口中)

将f1返回为null。如果我尝试:

f1 = oldSettings.Element(f + "ArrayOfKeyValueOfstringanyType");

然后将f1设置为整个XML文档,因为这是根元素。调用f1.Descendants()不再给我任何东西。

我是否引用了正确的命名空间? ArrayOfKeyValueOfstringanyType似乎有两个 - 我上面使用的那个,加上启动&x; xmlns的那个:i =&#34; https://...'。

如果我尝试:

var f2 = oldSettings.Elements(f + "KeyValueOfstringanyType");

var f2 = oldSettings.Descendants(f + "KeyValueOfstringanyType");

var f2 = oldSettings.Root.Descendants(f + "KeyValueOfstringanyType");

我得到了空。

按照http://msdn.microsoft.com/en-us/library/bb669152.aspx中给出的示例,我也试过了:

XNamespace xns = "http://schemas.microsoft.com/2003/10/Serialization/Arrays";
IEnumerable<XElement> kv = from el in oldSettings.Elements(xns + "KeyValueOfstringanyType")
                           select el;
var f4 = kv.ToList();

和f4也为空。

为了使这项工作,我需要做什么?我是否需要重新格式化XML以引入新的行字符? (该文件不是由我创建的)

感谢。

2 个答案:

答案 0 :(得分:1)

查看您尝试过的代码,似乎您只是不走运:p您尝试访问的元素是root元素的直接子元素,因此这个元素将获得所需的元素:

XElement f1 = oldSettings.Root.Element(f + "KeyValueOfstringanyType");

如果您使用Descendant,则需要致电ToList()ToArray(),或仔细阅读结果以查看实际内容:

var f2 = oldSettings.Descendants(f + "KeyValueOfstringanyType").ToList();

使用Descendants()时问题类似于您的问题:C# XML Node Works with Element But Not with Elelments

答案 1 :(得分:1)

你只是犯了一些简单的错误:

XElement f1 = oldSettings.Element(f + "KeyValueOfstringanyType");

应改为

XElement f1 = oldSettings.Root.Element(f + "KeyValueOfstringanyType");

因为您正在寻找根元素下面的元素。

var f2 = oldSettings.Descendants(f + "KeyValueOfstringanyType");

将返回预期的元素而不是null,所以你必须在代码中的某处出现som拼写错误。