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
而不是 XDocument
或 XElement
并检查是否有任何空元素,例如
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);
我正在尝试使用 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
而不是 XDocument
或 XElement
并检查是否有任何空元素,例如
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);