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

本文关键字:Xml xmlns 命名空间 | 更新日期: 2023-09-27 18:35:45

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

因此,我将内容.xml加载到XmlDocument"文档"中并遍历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);

问题是,在文件中,新节点仅包含<表单元格>...

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

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

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

在一些类似的讨论中,我读到您应该设置单元格。手动命名,但此属性是只读的...其他人建议在文本文件级别更改它(这是修补,它会很慢)

谁能给我一个提示?

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

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

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

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

> table:部分不是命名空间。它们是"命名空间前缀"。它们是实际命名空间的别名。它们必须在某个地方宣布。如果它们根本没有在源 XML 中声明,则它不是有效的 XML,并且您不应该期望能够处理它。

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