我目前正在一个项目中,我必须创建XMLNodes并将它们插入XML File中的特定位置。

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”作为名称的文档)

我希望有人也经历过此异常,并且可以帮助我理解此异常,以便我解决问题。



希望您能理解我的问题,如果没有,我会尽力更好地解释它。
我的英语有点生锈,所以如果我杀了它,请多多怜悯。

更新:

现在,它可与@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片段中,您没有定义与名称空间前缀ssx对应的namespaces。名称空间前缀只是给定元素作用域内实际名称空间表的缩写查询。因此以下

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


都定义相同的东西-一个名为{http://somenamespace}Row的XML元素。

ImportNode将节点从一个文档复制到另一个文档时,它会尝试将名称空间前缀从旧文档映射到新文档,以保留每个节点的实际名称空间-但是您的前缀缺少其定义,因此无法进行映射执行并引发异常。

若要更正此问题,必须将正确的名称空间定义添加到XML片段中,该定义应与Excel 2003 XML格式使用的定义一致。 Office 2003: XML Reference Schemas将告诉您正确的名称空间。这样做之后,您应该使用XmlDocument.LoadXml()加载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

关于c# - XMLDocument.Importnode失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28857669/

10-10 16:43