代码之家  ›  专栏  ›  技术社区  ›  Algoman

带命名空间但不带xmlns的Xml

  •  0
  • Algoman  · 技术社区  · 12 年前

    我正在用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=“THE_URI”>…-但原始文档没有这个xmlns,所以我也不想要它。。。

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

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

    有人能给我一个提示吗?

    2 回复  |  直到 10 年前
        1
  •  2
  •   Community Mohan Dere    9 年前

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

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

    看见 Creating a specific XML document using namespaces in C#

        2
  •  0
  •   John Saunders    12 年前

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

    你确定你加载的是整个XML文档吗?他们没有为了简化而省略零件吗?这些部分可能包含 表: .