C# 带命名空间但不带xmlns的Xml
我正在用C语言编写一个程序,在xml级别编辑打开的文档文件。例如,它将行添加到表中 因此,我将content.xml加载到一个XmlDocument“doc”中,并遍历xml结构。 假设我有一个XmlNode“行”中的节点,现在我想向其中添加一个节点。所以我打电话C# 带命名空间但不带xmlns的Xml,c#,xml,namespaces,xml-namespaces,C#,Xml,Namespaces,Xml Namespaces,我正在用C语言编写一个程序,在xml级别编辑打开的文档文件。例如,它将行添加到表中 因此,我将content.xml加载到一个XmlDocument“doc”中,并遍历xml结构。 假设我有一个XmlNode“行”中的节点,现在我想向其中添加一个节点。所以我打电话 XmlDocument doc = new XmlDocument(); doc.Load(filename); ... XmlNode row = ...; ... XmlNode cell = doc.CreateElement(
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时,我得到
... - 但是原始文档没有这个xmlns,所以我也不想要它
我尝试使用XmlTextWriter并设置writer.Settings.Namespaces=false,因为我认为,这应该会抑制xmlns的输出,但它只会导致一个异常-文档有一些名称空间,如果名称空间设置为false,则禁用这些名称空间。。。(wtf!?抑制xmlns的输出似乎比在存在xmlns的情况下引发异常更符合逻辑…)
在一些类似的讨论中,我读到您应该手动设置cell.Name,但此属性是只读的。。。
其他人建议在文本文件级别进行更改(这是修补,速度很慢)
有人能给我一个提示吗?每个名称空间都应该至少有一个带有URI的xmlns定义。这是两个标签之间的最终区别 但是,您只能在文件中声明一次xmlns属性(在开头) 看
表:部分不是名称空间。它们是“名称空间前缀”。它们是实际名称空间的别名。它们必须在某处申报。如果它们根本没有在源XML中声明,那么它就是无效的XML,您不应该期望能够处理它
您确定加载的是整个XML文档吗?他们没有删掉部分来简化吗?这些部分可能包含
表的定义:
仅供参考,C#没有忽略任何内容。这只是一种编程语言。是.NET忽略了你。它很乐意忽略在VB.NET.AH中编写相同代码的人:-)根元素确实有用于表等的xmlns项-因此我认为XML编写器没有理由再次将它们放在后续元素中(因为它们应该继承名称空间),除非它们的名称空间与根元素xmlns不同。。。我通过为后续节点传递相同的名称空间URI(而不仅仅是一个随机URI)来实现它,因此我现在的调用是doc.CreateElement(“table:table cell”,“urn:oasis:names:tc:opendocument:xmlns:table:1.0”);实际上,我从根元素中读取xmlns:table属性并将其传递给CreateElement(这样,该方法可以防止不同版本中的名称空间更改),而不是doc.CreateElement(“table:table cell”);非常感谢:-)