名称中不能包含':'字符,十六进制值0x3A


77

我有一个包含其元素的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

另请参阅stackoverflow.com/questions/8324960/…,以获取正确的名称空间处理。
Polluks

Answers:


115

如果要使用名称空间,则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'4

6
@ coure06:名称空间URI是动态的吗?真是奇怪 但是,可以的,您可以通过XNamespace.Xmlns + "ab"从声明元素的那个元素中找到属性值来获得它。
乔恩·斯基特


有趣的是,这似乎不适用于更新的字符串模板语法,因此$"{ab}test"会产生相同的错误
Liam,

2
@Liam:我希望-ab + "test"不执行字符串连接;它使用+(XNamespace, string)运算符创建一个XName
乔恩·斯基特

21

尝试将您的名称空间放入{...,}如下所示:

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

1
为什么要使用花括号?有什么好处?
barrypicker 2014年

使用该XNamespace方法实际上就是为您完成的。.ToStringXNamespace明明只是正确格式化字符串为您服务。因此,这是用不同的方式做的事情,两者都没有好处
Liam

18

我有同样的错误。我发现我正在添加代码...

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

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

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

...问题就消失了。


7

您可能要尝试使用Get方法的重载,其中要考虑名称空间。试试这个:

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

1
ab不是这里的实际名称空间-它只是名称空间的别名。(不幸的是,我不知道正确的术语。)使用LINQ to XML可以轻松实现XNamespace。很少需要显式调用XName.GetLINQ to XML。
乔恩·斯基特

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.