Enillion
Enillion

Reputation: 3

XElement.Load() and "undeclared prefix" exception

I'm trying to load xml file using Xelement.Load() method and in case of some files, I get "ditaarch" is an undeclared prefix exception. The content of such troublesome xml's are similar to this simplified version:

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

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

I've tried to follow suggestions to manually add or ignore "ditaarch" namespace using xml namespace manager:

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);
}  

But it leads to same exception as before. Most probably the solution is trivial but I just can't see it :(

If anyone would be able to point me in the right direction, I would be most grateful.

Upvotes: 0

Views: 1339

Answers (1)

Martin Honnen
Martin Honnen

Reputation: 167651

The presented markup is not namespace well-formed XML so I don't think XElement or XDocument is an option as it doesn't support colons in names. You can parse it with a legacy new XmlTextReader("foo.xml") { Namespaces = false } however.

And you could use XmlDocument instead of XDocument or XElement and check for any empty elements with e.g.

        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);

Upvotes: 2

Related Questions