gpt4 book ai didi

c# - XMLDocument.Importnode 失败

转载 作者:太空宇宙 更新时间:2023-11-03 13:10:41 25 4
gpt4 key购买 nike

我目前正在开展一个项目,我必须在该项目中创建 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 文件是一个 Excel 2003 工作表,有 3 个选项卡,但我只需要第一个。我加载它:

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

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

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

在这里我得到一个 XmlException

The ':' - characters Hex value 0x3A, shall not be included in a name.

我不知道这是从哪里来的。没有单元格或行获得自定义名称,我找不到包含除字母以外的任何内容的名称(名称为“#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 片段中,您没有定义 namespaces对应于命名空间前缀 ssx。 namespace 前缀只是对给定元素范围内的实际 namespace 表的缩写查找。因此下面

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

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

ImportNode将您的节点从一个文档复制到另一个文档,它会尝试将 namespace 前缀从旧文档映射到新文档以保留每个节点的实际 namespace ——但是您的前缀缺少它们的定义,因此无法执行映射并且出现异常被抛出。

要更正此问题,您必须将正确的命名空间定义添加到您的 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/

25 4 0