XElement.Load() 和 "undeclared prefix" 异常

XElement.Load() and "undeclared prefix" exception

我正在尝试使用 Xelement.Load() 方法加载 xml 文件,对于某些文件,我得到 "ditaarch" is an undeclared prefix 异常。这么麻烦的内容xml的类似这个简化版:

<?xml version="1.0" encoding="UTF-8"?>

<concept ditaarch:DITAArchVersion="1.3">
<title>Test Title</title>
<menucascade>
    <uicontrol>text</uicontrol>
    <uicontrol/>
</menucascade>
</concept>

我尝试按照建议使用 xml 命名空间管理器手动添加或忽略“ditaarch”命名空间:

using (XmlReader reader = XmlReader.Create(@"C:\test\example.xml"))
{
    NameTable nameTable = new NameTable();
    XmlNamespaceManager nameSpaceManager = new XmlNamespaceManager(nameTable);
    nameSpaceManager.AddNamespace("ditaarch", "");
    XmlParserContext parserContext = new XmlParserContext(null, nameSpaceManager, null, XmlSpace.None);
              
    XElement elem = XElement.Load(reader);
}  

但它会导致与以前相同的异常。解决方案很可能是微不足道的,但我就是看不到它:(

如果有人能指出正确的方向,我将不胜感激。

提供的标记不是命名空间 well-formed XML 所以我不认为 XElement 或 XDocument 是一个选项,因为它们不支持名称中的冒号。但是,您可以使用遗留 new XmlTextReader("foo.xml") { Namespaces = false } 解析它。

并且您可以使用 XmlDocument 而不是 XDocumentXElement 并检查是否有任何空元素,例如

        XmlDocument doc = new XmlDocument();
        using (XmlReader xr = new XmlTextReader("example.xml") { Namespaces = false })
        {
            doc.Load(xr);
        }

        Console.WriteLine("Number of empty elements: {0}", doc.SelectNodes("//*[not(*)][not(normalize-space())]").Count);