0

我正在使用 C# 编写一个在 xml 级别上编辑打开文档文件的程序。例如,它将行添加到表中。

因此,我将 content.xml 加载到 XmlDocument “doc”中并遍历 xml 结构。假设我在 XmlNode“行”中有 <table:table-row> 节点,现在我想向它添加一个 <table:table-cell> 节点。所以我打电话

XmlDocument doc = new XmlDocument();
doc.Load(filename);
...
XmlNode row = ...;
...
XmlNode cell = doc.CreateElement("table:table-cell");
row.Append(cell);
...
doc.Save(filename);

问题是,在文件中,新节点只包含 <table-cell>...</table-cell>

C# 只是决定忽略我告诉它的内容并在没有告诉我的情况下执行其他操作(起初我忽略了这个问题,并想知道为什么它不起作用,尽管生成的 xml 看起来不错)。

从我到目前为止收集到的信息来看,问题与“table:”是一个命名空间这一事实有关。当我还向 CreateElement 提供 NamespaceURI 时,我得到 <table:table-cell table:xmlns="THE_URI" >... - 但原始文档没有这个 xmlns,所以我也不想要它...

我尝试使用 XmlTextWriter 并设置 writer.Settings.Namespaces = false,因为我认为,这应该抑制 xmlns 的输出,但它只会导致异常 - 文档有一些命名空间,如果将命名空间设置为,则禁止这些命名空间错误...(wtf!?如果存在 xmlns,则抑制 xmlns 的输出似乎比抛出异常更合乎逻辑十亿倍...)

在一些类似的讨论中,我读到你应该手动设置 cell.Name ,但是这个属性是只读的......其他人建议在文本文件级别更改它(这是修补,它会很慢)

谁能给我一个提示?

4

2 回答 2

2

每个命名空间都应该至少有一个带有 URI 的 xmlns 定义。这是两个标签之间的最终区别。

但是,您可以在文件中仅声明一次 xmlns 属性(在开始时)。

请参阅 在 C# 中使用命名空间创建特定的 XML 文档

于 2013-10-17T17:13:27.753 回答
0

这些table:部分不是名称空间。它们是“命名空间前缀”。它们是实际命名空间的别名。它们必须在某处声明。如果它们根本没有在您的源 XML 中声明,那么它不是有效的 XML,您不应该期望能够处理它。

您确定您加载的是整个 XML 文档吗?他们没有遗漏零件以使其更简单吗?这些部分可能是包含定义的部分table:

于 2013-10-17T18:08:51.050 回答