3

我有一个要遍历的 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。关于如何克服这个问题的任何想法?

4

3 回答 3

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();
于 2010-11-26T20:46:17.210 回答
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>
于 2013-03-14T14:34:12.800 回答
0

尝试使用 XNamespace 来限定您要提取的 DataSet 元素。

于 2010-11-26T20:50:01.683 回答