.NET和XML:如何读取嵌套命名空间(<abc:xyz:name attr =“value”>)?</abc:xyz:name>

时间:2010-05-29 15:29:24

标签: .net xml xml-namespaces

假设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);“

3 个答案:

答案 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中使用空命名空间(这是默认设置),因此您可以简单地省略命名空间前缀。