【问题标题】:How to get an XElement with special characters in XML tag如何在 XML 标记中获取带有特殊字符的 XElement
【发布时间】:2011-05-16 08:42:50
【问题描述】:

我正在尝试遍历一个符合 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。关于如何克服这个问题的任何想法?

【问题讨论】:

  • 请注意,“:”不是标签中的特殊字符。它是分隔命名空间前缀和元素本地名称的分隔符。
  • 您的 XML 缺少命名空间声明。请参阅我的完整示例。如果您尝试在没有“xmlns:crf=...”的情况下运行它,则 Parse 方法会引发异常。
  • @Saunders, @m0sa:感谢您的提醒。完整的文档确实有一个 xmlns 条目,我只是不知道 ns 是用于命名空间的!再次感谢。

标签: c# linq-to-xml xelement xmlexception xname


【解决方案1】:

我遇到了同样的问题。这里的答案之一帮助了我,但不是一路,所以这是我的解决方案/澄清:

您需要做的是为您的命名空间指定一个 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>

【讨论】:

    【解决方案2】:
    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();
    

    【讨论】:

    • 如果您使用更简单的语法,我会投票赞成 - 如果您编辑答案以使用它,我会投票赞成。
    • 谢谢@Hightechrider,我不知道这个快捷方式。非常漂亮!
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      相关资源
      最近更新 更多