【问题标题】:Xml with Namespace but without xmlns带有命名空间但没有 xmlns 的 XML
【发布时间】:2013-10-26 07:20:19
【问题描述】:

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

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

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 时,我得到 ... - 但是原始文档没有这个 xmlns,所以我也不想要它...

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

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

谁能给我一个提示?

【问题讨论】:

  • 仅供参考,C# 并没有忽略任何东西。这只是编程语言。 .NET 忽略了你。它会很乐意忽略在 VB.NET 中编写相同代码的人。

标签: c# xml namespaces xml-namespaces


【解决方案1】:

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

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

Creating a specific XML document using namespaces in C#

【讨论】:

  • AH :-) 根元素确实有表等的 xmlns 条目 - 所以我认为 XML 编写器没有理由再次将它们放在后继者中(因为它们应该继承命名空间) 除非它们的命名空间与根元素 xmlns 不同...我通过为后继节点传递相同的命名空间 URI 来使其工作 - 而不仅仅是一个随机 URI,所以我现在的调用是 doc.CreateElement("table:table-cell" , "urn:oasis:names:tc:opendocument:xmlns:table:1.0");而不是 doc.CreateElement("table:table-cell", "randomURI.com/table"); 非常感谢 :-)
  • 实际上,我从根元素中读取了 xmlns:table 属性并将其传递给 CreateElement(这样,该方法对不同版本中的命名空间更改是安全的)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2010-12-07
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 2013-11-24
    相关资源
    最近更新 更多