我有一个我试图遍历的XML文档,它符合SDMX标准。这是一个简短的样本:
<root>
<csf:DataSet id="J10">
<kf:Series>
<value> 107.92
</value>
</kf:Series>
</csf:DataSet>
</root>
但是,当我尝试在C#中使用Linq to Xml执行以下操作时,我得到一个XmlException。
XElement dataset = document.Element("csf:DataSet");
例外文字是: “:”字符,十六进制值0x3A,不能包含在名称中。
我无法控制XML。关于如何克服这个问题的任何想法?
答案 0 :(得分:3)
var csf = XNamespace.Get("<csfNamespaceUri>");
document.Element(csf + "DataSet");
请注意,您必须指定csf名称空间的uri。一个完整的例子:
var doc = XDocument.Parse(@"
<root xmlns:csf=""http://tempuri.org/1"" xmlns:kf=""http://tempuri.org/2"">
<csf:DataSet id=""J10"">
<kf:Series>
<value> 107.92
</value>
</kf:Series>
</csf:DataSet>
</root>
");
var dataSet = doc.Descendants(XNamespace.Get("http://tempuri.org/1") + "DataSet").Single();
答案 1 :(得分:0)
尝试使用XNamespace来限定您要提取的DataSet元素。
答案 2 :(得分:0)
我遇到了同样的问题。其中一个答案在我的路上帮助了我,但并非一直如此,所以这是我的解决方案/澄清:
您需要做的是指定命名空间的URL,如下所示:
XNamespace ns = "http://www.example.com";
...然后在每个Element
中添加该命名空间:
var someElement = new XElement(ns + "ElementName", "Value");
为了使其正常工作,您必须在XML中包含该特定URI ,如下所示:
var rootElement =
new XElement(ns + "MyRootElement",
new XAttribute(XNamespace.Xmlns + "ns",
"http://www.example.com"));
现在您可以将someElement
(和其他人)添加到rootElement
,并且将包含命名空间,因为它已在根中引用(通过url):
rootElement.Add(someElement);
rootElement.Add(new XElement(ns + "OtherElement", "Other value"));
这将生成如下所示的XML:
<ns:MyRootElement xmlns:ns="http://www.example.com">
<ns:ElementName> (...) </ns:ElementName>
<ns:OtherElement> (...) </ns:OtherElement>
</ns:MyRootElement>