2016-10-12 9 views
0

私が持っている場合は、以下の構造を持つXMLファイル(例):子ノードに保つXMLの親ノードを削除

私は期待出力と listChildlistChild2を、削除したい
<Parent1> 
     <listChild> 
      <child> 
       <listchild2> 
        <child2> 
        <child2> 
        <child2> 
       </listchild2> 
      </child> 
      <child> 
       <listchild2> 
        <child2> 
        <child2> 
        <child2> 
       </listchild2> 
      </child> 
     </listchild> 
</parent1> 

<Parent> 
     <child> 
      <child> 
      <child> 
      <child> 
     </child> 
     <child> 
      <child> 
      <child> 
      <child> 
     </child> 
</parent> 

私はこのように、System.Xml.Linqを試してみました:

public void removeParentNode(String filename) 
{ 
    XDocument xdoc = XDocument.Load(filename); 

    //remove parent1 
    var child= xdoc.Descendants("child");      
    XElement dcuManager = new XElement("parent1 "); 
    parent1 .Add(child); 

    XDocument xdoc1 = new XDocument(dcuManager); 
} 

しかし、コードは外側のリストだけを削除します。

<listchild>タグと</listchild>タグだけを削除し、すべての子ノードを保持する方法はありますか?

------------------------更新--------------------- ---------------- XMLコード上記

は 私のXMLコードは非常に単純な例である:

<?xml version="1.0" encoding="utf-8"?> 
<DcuManager xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <listDcu> 
    <Dcu id="dcu1 id" mode="dcu1 mode" port="dcu1 port"> 
     <modemMgr> 
     <listModem> 
      <Modem id="Modem1 id" port="modem 1 port" communicationStatus="modem 1 mode"> 
      <meterManager> 
       <listMeter> 
       <Meter id="Meter 1 id" port="Meter 1 port" mac="Meter 1 mode" /> 
       </listMeter> 
      </meterManager> 
      </Modem> 
      <Modem id="Modem2 id" port="modem 2 port" communicationStatus="modem 2 mode"> 
      <meterManager> 
       <listMeter> 
       <Meter id="Meter 2 id" port="Meter 2 port" mac="Meter 2 mode" /> 
       </listMeter> 
      </meterManager> 
      </Modem> 
     </listModem> 
     </modemMgr> 
    </Dcu> 
    <Dcu id="dcu2 id" mode="dcu2 mode" port="dcu2 port"> 
     <modemMgr> 
     <listModem> 
      <Modem id="Modem3 id" port="modem 3 port" communicationStatus="modem 3 mode"> 
      <meterManager> 
       <listMeter> 
       <Meter id="Meter 3 id" port="Meter 3 port" mac="Meter 3 mode" /> 
       </listMeter> 
      </meterManager> 
      </Modem> 
      <Modem id="Modem4 id" port="modem 4 port" communicationStatus="modem 4 mode"> 
      <meterManager> 
       <listMeter> 
       <Meter id="Meter 4 id" port="Meter 4 port" mac="Meter 4 mode" /> 
       </listMeter> 
      </meterManager> 
      </Modem> 
     </listModem> 
     </modemMgr> 
    </Dcu> 
    <Dcu id="dcu3 id" mode="dcu3 mode" port="dcu3 port"> 
     <modemMgr> 
     <listModem> 
      <Modem id="Modem5 id" port="modem 5 port" communicationStatus="modem 5 mode"> 
      <meterManager> 
       <listMeter> 
       <Meter id="Meter 5 id" port="Meter 5 port" mac="Meter 5 mode" /> 
       </listMeter> 
      </meterManager> 
      </Modem> 
      <Modem id="Modem6 id" port="modem 6 port" communicationStatus="modem 6 mode"> 
      <meterManager> 
       <listMeter> 
       <Meter id="Meter 6 id" port="Meter 6 port" mac="Meter 6 mode" /> 
       </listMeter> 
      </meterManager> 
      </Modem> 
     </listModem> 
     </modemMgr> 
    </Dcu> 
    </listDcu> 
</DcuManager> 

このコードはC#クラスをXMLに変換しています。 私は、子ノードを保持しているdcuMgr、modemMgr、meterMgrを削除します。 どうすればよいですか?

+0

代わりに 'listchild'を削除した場合、コードは正常に動作します。あなたのコードをどのような問題で更新しているのかは分かりません。 –

+0

概念的には、ノードのコンテンツをコピーしてから、ノード自体を削除し、親ノードのコンテンツに貼り付ける必要があると思います。あなたはそれを処理する関数を作ることができますか? – Khyron

答えて

0

お客様の仕様はあまり明確ではありません。 XML自体には「リスト」という概念はありません。どの要素も任意の数の子要素を含むことができ、XMLは要素の名前が何であるかを気にしません。要素内で単語 "list"を使用しても実際にはリストにはなりません。

また、XMLの例では、2つの異なる種類の「子」ノードが表示されます。外側はchild、内側はchild2という名前です。しかし、あなたの望む出力には、名前はchildしかありません。 child2ノードはchildノードに置き換えられているようです。

残念ながら、表示されるXMLは有効なXMLでさえありません。したがって、あなたに何をしようとしているのかを理解することがさらに困難になるので、 XMLの例を提供していないことはかなり明白です。

すべての点を念頭に置いて、一連のネストされたオブジェクトに同じアルゴリズムを適用する場合、基本的なアプローチは再帰に基づくものであることを指摘します。私。保持するノードを再帰的に選択し、同じ削除ロジックを適用したいとします。あなたは心の中での行動のいくつかの他の種類を持っている場合

class Program 
{ 
    const string _kxmlInput = 
     @"<parent1> 
     <listchild> 
      <child> 
       <listchild2> 
        <child/> 
        <child/> 
        <child/> 
       </listchild2> 
      </child> 
      <child> 
       <listchild2> 
        <child/> 
        <child/> 
        <child/> 
       </listchild2> 
      </child> 
     </listchild> 
</parent1>"; 

    static void Main(string[] args) 
    { 
     Console.WriteLine(removeParentNode(_kxmlInput)); 
    } 

    static string removeParentNode(string xml) 
    { 
     StringReader reader = new StringReader(xml); 

     XDocument xdoc = XDocument.Load(reader); 

     //remove parent1 
     XDocument xdoc1 = new XDocument(KeepDescendants(xdoc.Root, "child")); 

     StringBuilder sb = new StringBuilder(); 
     XmlWriterSettings settings = new XmlWriterSettings { Indent = true }; 

     using (XmlWriter xmlWriter = XmlWriter.Create(sb, settings)) 
      xdoc1.WriteTo(xmlWriter); 

     return sb.ToString(); 
    } 

    private static XElement KeepDescendants(XElement node, string descendantName) 
    { 
     var child = node.Descendants(descendantName).Select(c => KeepDescendants(c, descendantName)); 

     if (!child.Any()) 
     { 
      return node; 
     } 

     XElement newParent = new XElement(node.Name); 

     newParent.Add(child); 

     return newParent; 
    } 
} 

、あなた:ここ

は、この基本的な考え方を示してComplete, Minimal, and Verifiable code example(すなわち、最初の場所で問題に含まれているべきものに似ている)であります実際に何をしたいのかを達成するために上記の基本的なテクニックを適応させることができるはずです。

+0

私の質問に注目していただきありがとうございます。私は少し英語を話すことができます。ご理解ください。 –

+0

私のXMLコードを書き直して: –

+0

あなたの編集はあまり明確にはなりませんでした。 XMLはうまく構成されておらず、 'DcuManager'ノードを削除したいが、ルートノードである前の例に基づいているとします。ルートノードの削除方法を理解していないままです。また、保持したいノードから削除/平滑化したいノードを区別するものが明確ではありません。新しいXMLの例では、名前に "list"というノードがありますが、そのノードを削除したくないようです。私は本当に上記の方法であなたを得ることができると思うが、まだ助けが必要な場合は、質問を多く改善する必要があります。 –

関連する問題