读取 XML 和未声明的命名空间

Posted

技术标签:

【中文标题】读取 XML 和未声明的命名空间【英文标题】:Reading XML and undeclared namespace 【发布时间】:2013-12-04 23:15:07 【问题描述】:

当我尝试读取 XML 文件时收到此错误消息

 Unhandled Exception: System.Xml.XmlException: 'xi' is an undeclared namespace. Line 12, position 18.
   at System.Xml.XmlTextReaderImpl.Throw(Exception e)
   at System.Xml.XmlTextReaderImpl.Throw(String res, String arg, Int32 lineNo, Int32 linePos)
   at System.Xml.XmlTextReaderImpl.LookupNamespace(NodeData node)
   at System.Xml.XmlTextReaderImpl.ElementNamespaceLookup()
   at System.Xml.XmlTextReaderImpl.ParseAttributes()
   at System.Xml.XmlTextReaderImpl.ParseElement()
   at System.Xml.XmlTextReaderImpl.ParseElementContent()
   at System.Xml.XmlTextReaderImpl.Read()
   at System.Xml.XmlTextReader.Read()

读取 XML 的代码:

   XmlTextReader reader = new XmlTextReader("file.xml");
    while (reader.Read())
    
        // Do some work here on the data.
        Console.WriteLine(reader.Name);
    
    Console.ReadLine();

xml文件:

<?xml version="1.0" encoding="ISO-8859-1"?>    
<doh> 
        <!-- Available Resources-->
        <servers>
                <xi:include href="file.xml"/>
        </servers>

【问题讨论】:

您的 XML 无效,没有定义 xi 命名空间。 xi 是命名空间的别名,但未定义 xmlns:alias=namespace-uri。因此,您使用的是“未声明的前缀” 我别无选择。我必须按原样使用 xml 文件。有窍门吗?还是忽略 xi 的解决方法? 仅供参考,您不应使用new XmlTextReader()new XmlTextWriter()。自 .NET 2.0 以来,它们已被弃用。请改用XmlReader.Create()XmlWriter.Create() 你是对的——你别无选择。你永远不会完成这项工作。 XML 根本无效。这不是您缺乏知识的问题 - XML 简直就是垃圾。满足读取此文件要求的唯一方法是创建文件的人更改它。否则,是时候找一份新工作了。 【参考方案1】:

我假设您想要使用 XInclude。您必须定义 xi 前缀映射到哪个命名空间。最简单的原因是在根元素中包含命名空间映射。

  <doh xmlns:xi="http://www.w3.org/2001/XInclude">

请注意,XmlTextReader 不会包含“file.xml”。您将不得不通过其他一些代码“包含”。可以在 MSDN http://msdn.microsoft.com/en-us/library/aa302291.aspx 上找到有关 XInclude 的优秀背景文件

【讨论】:

我无法更改 xml 文件。必须按原样使用它。有没有办法忽略它?将其视为评论? 您显示的 XML 错误,它不是有效的 XML。任何语言的所有xml阅读器都会报错。您应该回到 XML 的生产者那里,让他们生成正确的 XML。

以上是关于读取 XML 和未声明的命名空间的主要内容,如果未能解决你的问题,请参考以下文章

C# 在忽略命名空间的同时反序列化 xml

默认情况下声明了哪些 XML 命名空间?

读取带命名空间的Xml文档的方法备忘

JAXB 编组:更改应声明命名空间的元素

基于多部分 xml 根声明创建具有命名空间前缀的元素

xml命名空间声明:自动替换包名