Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带命名空间但不带xmlns的Xml_C#_Xml_Namespaces_Xml Namespaces - Fatal编程技术网

C# 带命名空间但不带xmlns的Xml

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(

我正在用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提供名称空间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”);非常感谢:-)