带有命名空间但没有xmlns的Xml

时间:2013-10-17 16:59:21

标签: c# xml namespaces xml-namespaces

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

所以我将content.xml加载到XmlDocument“doc”中并遍历xml结构。 假设我有< table:table-row> XmlNode“行”中的节点,现在我想添加一个< 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);

问题是,在文件中,新节点只包含 <表电池> ...< /表电池>

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

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

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

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

任何人都可以给我一个提示吗?

2 个答案:

答案 0 :(得分:2)

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

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

请参阅 Creating a specific XML document using namespaces in C#

答案 1 :(得分:0)

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

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