假设XML数据中有一个元素:<abc:xyz:name attr="value"/>
我正在尝试使用XmlReader阅读它。问题是我得到了
的XmlException':'字符,十六进制值0x3A,不能包含在名称
中
我已经声明了“abc”命名空间。我也尝试添加“abc:xyz”和“xyz”命名空间。但这根本没有帮助。我可以在解析之前替换一些文本,但可能会有一些更优雅的解决方案。那我该怎么办?
这是我的代码:
XmlReaderSettings settings = new XmlReaderSettings()
NameTable nt = new NameTable();
XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt);
nsmgr.AddNamespace("abc", "");
nsmgr.AddNamespace("xyz", "");
XmlParserContext context = new XmlParserContext(null, nsmgr, null, XmlSpace.None);
// So this reader can't read <abc:xyz:name attr="value"/>
XmlReader reader = XmlReader.Create(path, settings, context);“
答案 0 :(得分:4)
你真的可以期待Xml解析器解析正确的Xml。在这种情况下,“Xml”没有正确形成,并且实际上不 xml。
因此,您唯一的选择是对“Xml”进行一些文本修改,以使其成为可以解析的有效Xml
。
更好的是,如果可以的话,修复任何认为它生成Xml的东西,以便at真正生成正确的Xml。
答案 1 :(得分:3)
XML实体属于单个命名空间,并且没有命名空间前缀的嵌套。
XmlReader抱怨,因为它看到一个冒号,并将前面的所有内容解释为前缀。然后它会看到另一个冒号和barfs,因为元素名称不允许有冒号。
另外 - 为了清楚起见 - 当你调用nsmgr.AddNamespace()时,你传递的“abc”和“xyz”值是前缀,而不是命名空间。命名空间是该方法的第二个arg。在这两种情况下,命名空间都是空字符串。不知道为什么你会这样做。
您需要退后一步,找出您认为在元素上需要两个命名空间的原因。还有为什么你在空命名空间中使用前缀。
答案 2 :(得分:1)
元素只能属于一个名称空间,名称空间被定义为(基本上)一个字符串,通常是一个URL。考虑到这一点,嵌套命名空间毫无意义。
您可以嵌套元素,但每个元素只属于一个名称空间,默认名称空间(无前缀)或与限定名称前缀关联的名称空间。
另一种思考命名空间的方法是回答“谁决定这个元素的含义?”的问题。一旦你知道,你指定一个名称空间来代表“谁”。
命名空间用于消除节点的含义,例如,当您在xml文件中将来自不同源的两个元素组合在一起时。如果您正在合并关于烹饪食谱统计数据和烹饪食谱本身的饼图数据,那么元素“馅饼”可能意味着两种不同的东西 - 饼图或饼图配方。 (确实如此,诚然!)为了确保每个元素得到正确的处理(渲染图表,并消耗可食用的馅饼),xml应该在每个pie元素前面加上一个名称空间前缀,以显示它代表什么以及如何处理它。 / p>
在您的情况下,您在两个instnaces中使用空命名空间(这是默认设置),因此您可以简单地省略命名空间前缀。