如何获取 XML 标记中包含特殊字符的 XElement

发布于 2024-10-04 14:14:01 字数 474 浏览 2 评论 0原文

我正在尝试遍历一个符合 SDMX 的 XML 文档。下面是一个简短的示例:

<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。关于如何克服这个问题有什么想法吗?

I have an XML document I'm trying to traverse, which is SDMX-compliant. Here's a short sample:

<root>
    <csf:DataSet id="J10"> 
     <kf:Series> 
       <value> 107.92
       </value> 
     </kf:Series> 
    </csf:DataSet>
</root>

However, when I try to do the following using Linq to Xml in C#, I get an XmlException.

XElement dataset = document.Element("csf:DataSet");

The Exception text is:
The ':' character, hexadecimal value 0x3A, cannot be included in a name.

I have no control over the XML. Any ideas on how I can overcome this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

熊抱啵儿 2024-10-11 14:14:01
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();
var csf = XNamespace.Get("<csfNamespaceUri>");
document.Element(csf + "DataSet");

Note that you have to specify the uri of the csf namespace. A full example:

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();
好菇凉咱不稀罕他 2024-10-11 14:14:01

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

Try using XNamespace to qualify the DataSet element you are looking to extract.

远山浅 2024-10-11 14:14:01

我也有同样的问题。这里的答案之一帮助了我,但不是全部,所以这是我的解决方案/说明:

您需要做的是为您的命名空间指定一个 URL,如下所示:

XNamespace ns = "http://www.example.com";

...然后在每个中添加该命名空间元素

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 (和其他元素)添加到 < code>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>

I had the same problem. One of the answers here helped me on my way, but not all the way, so here is my solution / clarification:

What you need to do is specify an URL for your namespace, like this:

XNamespace ns = "http://www.example.com";

...then prepend that namespace in each Element:

var someElement = new XElement(ns + "ElementName", "Value");

For this to work however, you must include that specific URI in the XML as follows:

var rootElement = 
    new XElement(ns + "MyRootElement",
                 new XAttribute(XNamespace.Xmlns + "ns", 
                                "http://www.example.com"));

Now you can add someElement (and others) to rootElement, and the namespace will be included, because it has been referenced (by the url) in the root:

rootElement.Add(someElement);
rootElement.Add(new XElement(ns + "OtherElement", "Other value"));

This will generate XML that looks something like this:

<ns:MyRootElement xmlns:ns="http://www.example.com">
    <ns:ElementName> (...) </ns:ElementName>
    <ns:OtherElement> (...) </ns:OtherElement>
</ns:MyRootElement>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文