“:”字符,十六进制值为0x3A,不能包含在名称中。

93
我有一个包含元素的 XML 文件。
<ab:test>Str</ab:test>  

当我尝试使用以下代码访问它:

XElement tempElement = doc.Descendants(XName.Get("ab:test")).FirstOrDefault();

我遇到了这个错误:

System.Web.Services.Protocols.SoapException:服务器无法处理请求。 ---> System.Xml.XmlException:':'字符,十六进制值为0x3A,不能包含在名称中。

我该如何访问它?


你肯定有一种处理命名空间的方法,这样你就不必(或在这种情况下,你不能)将它们放在名称中。你应该朝这个方向去看。 - p4bl0
2
XML规范不仅说明“:”是允许作为名称(并且可以用来开始名称),XName的Get方法也没有记录它会抛出XmlException! - yoozer8
请参阅 https://dev59.com/b2sy5IYBdhLWcg3wxQ4k 以正确处理命名空间。 - Polluks
7个回答

134

如果你想使用命名空间,LINQ to XML非常容易实现:

XNamespace ab = "http://whatever-the-url-is";
XElement tempElement = doc.Descendants(ab + "test").FirstOrDefault();

在您的文档中查找xmlns:ab=...部分以查找“ab”所指的命名空间URI。


2
它能工作,但问题在于xmlns:ab的值是根据时间戳动态生成的。我该如何获取它的值? - coure2011
8
命名空间URI是动态的?这很奇怪。但是,是的,你可以通过查找声明它的任何元素中XNamespace.Xmlns + "ab"属性的值来获取它。 - Jon Skeet
我遇到了这个错误:http://stackoverflow.com/questions/42839628/how-to-get-certain-elements-inside-an-xml-document/42840373#42840373 - Si8
1
有趣的是,这似乎不能与较新的字符串模板语法一起使用,所以 $"{ab}test" 会产生相同的错误。 - Liam
5
@Liam:我希望 - ab + "test" 并不是在执行字符串连接操作;它是在使用 +(XNamespace, string) 运算符来创建一个 XName - Jon Skeet

27

尝试将命名空间放入{ ... }中,就像这样:

string xfaNamespace = "{http://www.xfa.org/schema/xfa-template/2.6/}";

1
为什么你应该使用花括号?这有什么好处? - barrypicker
1
使用 XNamespace 方法本质上就是为您完成这个操作。在 XNamespace 上调用 .ToString 方法显然只是为您正确格式化字符串。因此,这是以不同方式完成的相同操作,两种方法都没有优劣之分。 - Liam

22

我遇到了同样的错误。我发现是因为我添加了代码...

var ab = "http://whatever-the-url-is";

...但是ab被确定为字符串。这导致了OP报告的错误。我使用了实际的数据类型XNamespace,而不是使用VAR关键字...

XNamespace ab = "http://whatever-the-url-is";

...然后问题就消失了。


7

有一个Get方法的超载版本,您可能想尝试考虑命名空间。请尝试以下操作:

XElement tempElement = doc.Descendants(XName.Get("test", "ab")).FirstOrDefault();

1
这里的ab并不是实际的命名空间,而只是该命名空间的别名。(不幸的是,我不知道正确的术语。)使用XNamespace,LINQ to XML使这变得容易。在LINQ to XML中,很少需要显式调用XName.Get - Jon Skeet

5
尝试从文档中获取命名空间。
var ns = doc.Root.Name.Namespace;

0

删除 AndroidManifest.xmlAndroidManifest.xml.DISABLED 对我有用。


0
':'字符在命名空间中会引起问题。例如:
<?xml version="1.0"?>
  <SAMLConfiguration xmlns="urn:componentspace:SAML:2.0:configuration">
    <ServiceProvider Name="http://avanteam"
      Description="Avanteam Service Provider"
      AssertionConsumerServiceUrl="SAML/AssertionConsumerService"
      LocalCertificateFile="Certificates\sp.pfx"
      LocalCertificatePassword="password"/>
  </SAMLConfiguration>

在所有情况下都适用的解决方案是使用XNamespace实例上的GetName方法。以下是一个默认命名空间的示例:
var ns = doc.Root.GetDefaultNamespace();
var serviceProviderNode = doc.Element(ns.GetName("SAMLConfiguration"))?.Element(ns.GetName("ServiceProvider"));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接