Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XMLDocument.Importnode失败_C#_Xml_Excel_Xmldocument_Xmlnode - Fatal编程技术网

C# XMLDocument.Importnode失败

C# XMLDocument.Importnode失败,c#,xml,excel,xmldocument,xmlnode,C#,Xml,Excel,Xmldocument,Xmlnode,我目前正在从事一个项目,我必须创建XMLNodes并将它们插入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>

我目前正在从事一个项目,我必须创建XMLNodes并将它们插入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>
我想在其中添加节点的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
string innerXml=@”
基础知识
100
基础知识
---
";
var xdoc=new XmlDocument();
xdoc.LoadXml(innerXml);//不要使用新的XmlTextReader(sr){Namespaces=false})
XmlDocument xtemplate=新的XmlDocument();
//像以前一样从文件加载xtemplate
XmlNode tempnode=xtemplate.ImportNode(xdoc.DocumentElement,true);
//插入到目标文档中
tempnode.ChildNodes[0].ParentNode.Attributes.RemoveAt(0);//乘以5删除所有命名空间定义

问题在于,在XML片段中,您没有定义与命名空间前缀
ss
x
对应的。名称空间前缀只是对给定元素范围内的实际名称空间表的缩写查找。因此

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

1) 您的XML是否在每个引号之前都有这些反斜杠?2) 第一行末尾有一个未关闭的报价:“。这是一个输入错误吗?哦,糟糕,反斜杠在那里,因为我用Stringbuilder构建了这个节点,并从中复制了XML。它们在原始文件中没有。这对我来说很有意义,但我使用的XMLTextreader没有名称空间,因为xTemplate中的文档也有名称空间定义。我测试了您的解决方案,效果很好,但在导入节点后,我必须删除名称空间定义。
<ss:Row xmlns:ss="http://somenamespace"/>
<xxxx:Row xmlns:xxxx="http://somenamespace"/>
<Row xmlns="http://somenamespace"/>
        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