2015-09-21 46 views
0

当属性我有一个XML文件:摆脱的xmlns的添加节点到现有的XML

<ns2:root xmlns:ns2="namespace"> 
    <ns2:a> 
     <ns2:b>some content</b> 
     <ns2:c>some content</c> 
     <ns2:d>some content</d> 
    </a> 
</root> 

我需要在特定的位置添加一个新的节点,我的代码是:

var doc = XDocument.Load(file); 
XNamespace ns2 = "namespace"; 
doc.Element(ns2 + "root").Element(ns2 + "a").Element(ns2 + "c").AddAfterSelf(
    new XElement(ns2+"new", 
     new XElement("new1", 
      new XElement("new2","some content"), 
      new XElement("new3", "some content")))); 

的输出是:

<ns2:root xmlns:ns2="namespace"> 
    <ns2:a> 
     <ns2:b>some content</b> 
     <ns2:c>some content</c> 
     <ns2:new> 
      <new1 xmlns=""> 
       <new2>some content</new2> 
       <new3>some content</new3> 
      </new1> 
     </new> 
     <ns2:d>some content</d> 
    </a> 
</root> 

所需的输出是:

<ns2:root xmlns:ns2="namespace"> 
    <ns2:a> 
     <ns2:b>some content</b> 
     <ns2:c>some content</c> 
     <ns2:new> 
      <new1> 
       <new2>some content</new2> 
       <new3>some content</new3> 
      </new1> 
     </new> 
     <ns2:d>some content</d> 
    </a> 
</root> 

如何避免将xmlns atrribute添加到节点new1?


在希望的输出中编辑错误。

+0

从* *信息的角度来看,它们是相同的每一个元素名称前添加“NS2 +”。通常,您不应该关心XML工具如何选择代表信息,除非您将此XML提供给实际上不适用于XML的内容,否则它不应该成为问题 - 如果它适用于“字符串已满的尖括号看起来像XML“,但要求绝对格式化,那么通常最好是推动更改已损坏的组件,而不是试图在XML中强制使用特定的表示。 –

+1

您的示例XML无效,如果更正,我无法重现您声称的行为。我强烈怀疑在XML中有*实际上* xmlns =“...”',这会显着改变事情。此外,您所需的输出与您当前的输出非常不同 - 它具有包含文本的“new1”和“new2”元素,而不是包含具有文本的“new2”和“new3”的“new1”。请展示一个简短但完整的示例来展示问题,并让您的问题保持一致。 –

回答

0

需要在地图命名空间

var doc = XDocument.Load(file); 
XNamespace ns2 = "namespace"; 
doc.Element(ns2 + "root").Element(ns2 + "a").Element(ns2 + "c").AddAfterSelf(
    new XElement(ns2+"new", 
     new XElement(ns2+"new1", 
      new XElement(ns2+"new2","some content"), 
      new XElement(ns2+"new3", "some content")))); 
+0

已经尝试过,每个节点前都有“ns2:”前缀,这不是我所需要的。 –