XMLDocument.Importnode 失败

2023-12-26

我目前正在开发一个项目,我必须创建 XMLNode 并将它们插入 XML 文件中的特定位置。

XMLNode 是一个包含大约 90 个单元的行。

<Row ss:AutoFitHeight=\"0\">
<Cell ss:StyleID=\"s77\"><Data ss:Type=\"String\">ABC</Data></Cell>
<Cell><Data ss:Type=\"Number\">100</Data></Cell>
<Cell ss:StyleID=\"s77\"><Data ss:Type=\"String\">ABC</Data></Cell>
<Cell><Data ss:Type=\"String\" x:Ticked=\"1\">&#45;&#45;-</Data></Cell>
</Row>

我通过 Stringbuilder 创建文档并使用以下命令读取它们:

    using (StringReader sr = new StringReader((sbuilder.ToString())))
    using (XmlTextReader xtr = new XmlTextReader(sr) { Namespaces = false })
    {
        xdoc.Load(xtr);
    }

我想要添加节点的 XML 文件是一个带有 3 个选项卡的 Excel 2003 工作表,但我只需要第一个。我将其加载为:

    XmlDocument xtemplate = new XmlDocument();
    xtemplate.Load(file);

并尝试将我的节点导入到模板 XML 中

XmlNode tempnode = xtemplate.ImportNode(xdoc.DocumentElement, true);

在这里我得到一个 XmlException

':' - 字符十六进制值 0x3A,不得包含在名称中。

我不知道这是从哪里来的。没有单元格或行获得自定义名称,并且我找不到包含除字母以外的任何内容的名称(名称为“#document”的文档除外)

我希望有人也经历过这个异常,并可以帮助我理解它,这样我就可以解决我的问题。


我希望您能理解我的问题是什么,如果不能理解,我会尽力更好地解释它。 我的英语有点生疏,所以如果我把它宰了,请仁慈。

Update:

它现在正在使用 @dbc 的解决方案和一点补充:

string innerXml = @"<Row 
            xmlns=""urn:schemas-microsoft-com:office:spreadsheet"" 
            xmlns:o=""urn:schemas-microsoft-com:office:office"" 
            xmlns:x=""urn:schemas-microsoft-com:office:excel"" 
            xmlns:ss=""urn:schemas-microsoft-com:office:spreadsheet"" 
            xmlns:html=""http://www.w3.org/TR/REC-html40"" 
            ss:AutoFitHeight=""0"">

            <Cell ss:StyleID=""s77"">
                <Data ss:Type=""String"">ABC</Data>
            </Cell>
            <Cell>
                <Data ss:Type=""Number"">100</Data>
            </Cell>
            <Cell ss:StyleID=""s77"">
                <Data ss:Type=""String"">ABC</Data>
            </Cell>
            <Cell>
                <Data ss:Type=""String"" x:Ticked=""1"">&#45;&#45;-</Data>
            </Cell>
        </Row>";


        var xdoc = new XmlDocument();
        xdoc.LoadXml(innerXml); // Do not use new XmlTextReader(sr) { Namespaces = false })

        XmlDocument xtemplate = new XmlDocument();
        // Load xtemplate from file as before 

        XmlNode tempnode = xtemplate.ImportNode(xdoc.DocumentElement, true); 
// Insert into Target Document
tempnode.ChildNodes[0].ParentNode.Attributes.RemoveAt(0); // Times 5 to delete all Namespacedefinitions

问题是,在您的 XML 片段中,您没有定义命名空间 https://msdn.microsoft.com/en-us/library/aa468565.aspx对应命名空间前缀ss and x。命名空间前缀只是对给定元素范围内的实际命名空间表的缩写查找。因此下面的

<ss:Row xmlns:ss="http://somenamespace"/>
<xxxx:Row xmlns:xxxx="http://somenamespace"/>
<Row xmlns="http://somenamespace"/>

都定义了相同的东西——一个名为{http://somenamespace}Row.

When ImportNode https://msdn.microsoft.com/en-us/library/system.xml.xmldocument.importnode%28v=vs.110%29.aspx将节点从一个文档复制到另一个文档,它尝试将名称空间前缀从旧文档映射到新文档,以保留每个节点的实际名称空间 - 但您的前缀缺少它们的定义,因此无法执行映射并出现异常被抛出。

要纠正此问题,您必须将正确的命名空间定义添加到 XML 片段中,与 Excel 2003 XML 格式使用的命名空间定义一致。这Office 2003:XML 参考架构 http://www.microsoft.com/en-us/download/details.aspx?id=101会告诉你正确的命名空间。完成此操作后,您应该使用XmlDocument.LoadXml() https://msdn.microsoft.com/en-us/library/system.xml.xmldocument.loadxml%28v=vs.110%29.aspx加载 XML 片段,然后抛出异常ImportNode将会消失。

例如:

        string innerXml = @"<Row 
            xmlns=""urn:schemas-microsoft-com:office:spreadsheet"" 
            xmlns:o=""urn:schemas-microsoft-com:office:office"" 
            xmlns:x=""urn:schemas-microsoft-com:office:excel"" 
            xmlns:ss=""urn:schemas-microsoft-com:office:spreadsheet"" 
            xmlns:html=""http://www.w3.org/TR/REC-html40"" 
            ss:AutoFitHeight=""0"">

            <Cell ss:StyleID=""s77"">
                <Data ss:Type=""String"">ABC</Data>
            </Cell>
            <Cell>
                <Data ss:Type=""Number"">100</Data>
            </Cell>
            <Cell ss:StyleID=""s77"">
                <Data ss:Type=""String"">ABC</Data>
            </Cell>
            <Cell>
                <Data ss:Type=""String"" x:Ticked=""1"">&#45;&#45;-</Data>
            </Cell>
        </Row>";


        var xdoc = new XmlDocument();
        xdoc.LoadXml(innerXml); // Do not use new XmlTextReader(sr) { Namespaces = false })

        XmlDocument xtemplate = new XmlDocument();
        // Load xtemplate from file as before 

        XmlNode tempnode = xtemplate.ImportNode(xdoc.DocumentElement, true); // No exception
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XMLDocument.Importnode 失败 的相关文章

随机推荐