我正在从文件中读取一些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以引入新的行字符? (该文件不是由我创建的)
感谢。
答案 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拼写错误。