2012-01-22 38 views
4

最後の子の後ろに要素をXMLに追加したいとします。しかし、私はエラーが発生しました。最後の特定のノード/要素の後にXML要素を挿入する

<XML ID="Microsoft Search Thesaurus"> 
    <thesaurus xmlns="x-schema:tsSchema.xml"> 
    <diacritics_sensitive>0</diacritics_sensitive> 
    <expansion> 
     <sub>Internet Explorer</sub> 
     <sub>IE</sub> 
     <sub>IE5</sub> 
    </expansion> 
    <replacement> 
     <pat>NT5</pat> 
     <pat>W2K</pat> 
     <sub>Windows 2000</sub> 
    </replacement> 
    <expansion> 
     <sub>run</sub> 
     <sub>jog</sub> 
    </expansion> 
    <expansion> 
     <sub>home</sub> 
     <sub>house</sub> 
    </expansion> 
    </thesaurus> 
</XML> 

私のコードは以下の通りです、私は、コードをデバッグするとき、私は、このエラーが発生しました。

InvalidOperationExceptionが処理されませんでした。

シーケンスに要素が含まれていません。

XDocument doc = XDocument.Load("tseng.xml"); //load the xml file. 
IEnumerable<XElement> MemberList = doc.Element("XML").Elements("thesaurus"); 
var Member = new XElement("expansion", 
       new XElement("sub", "home"), 
       new XElement("sub", "house") 
      ); 
MemberList.Last().AddAfterSelf(Member); //add node to the last element. 
doc.Save("tseng.xml"); 

このエラーは、特定の行のためにある:

MemberList.Last().AddAfterSelf(Member); 

私は、このコードに私の問題が何であるかを知りません。最後の<expansion>ノードの後の要素をXMLファイルに追加するにはどうすればよいですか?

この問題を解決できますか?ありがとう。それがルートXMLノードのためのものと異なるよう

答えて

6

<thesaurus>要素がxmlnsがあります

var MemberList = root.Elements(ns + "thesaurus"); 
var Member = new XElement(ns + "expansion", 
    new XElement(ns + "sub", "home"), 
    new XElement(ns + "sub", "house") 
); 
MemberList.Last().Add(Member); 

これは、以下の例のようにXMLを生成します:あなたが最後thesaurus要素の下に新しいexpansion要素を追加したい場合は、代わりにこのコードを使用する必要があります属性は名前空間を指定するため、すべての要素名に名前空間を追加する必要があります。また、新しい<expansion>要素を<thesaurus>の後に表示する場合は、AddAfterSelfの代わりにAddを使用する必要があります。

XNamespace ns = "x-schema:tsSchema.xml"; 
IEnumerable<XElement> MemberList = doc.Element("XML").Elements(ns + "thesaurus"); 
var Member = new XElement(ns + "expansion", 
       new XElement(ns + "sub", "home"), 
       new XElement(ns + "sub", "house")); 
MemberList.Last().Add(Member); //add node to the last element. 
+0

あなたのソリューションをありがとう。 – mkacar

0

あなたは、thesaurus要素に対して明示的に名前空間を指定する必要があります。また

XNamespace ns = "x-schema:tsSchema.xml"; 
XDocument doc = XDocument.Load("tseng.xml"); 
IEnumerable<XElement> MemberList = doc.Element("XML").Elements(ns + "thesaurus"); 

、心に留めておくあなたの現在のコードはthesaurus後に新しいexpansion要素を追加します1つは、その子供としてではありません。

<XML ID="Microsoft Search Thesaurus"> 
    <thesaurus xmlns="x-schema:tsSchema.xml"> 
    <diacritics_sensitive>0</diacritics_sensitive> 
    <!-- elided: new element goes here --> 
    <expansion> 
     <sub>home</sub> 
     <sub>house</sub> 
    </expansion> 
    </thesaurus> 
</XML> 
+0

ご返信ありがとうございます。 root.Elements(ns + "thesaurus")を削除します。コードをデバッグします。されております。 Michael LiuはシソーラスXMLファイルの要素を追加するための正しいコードを投稿しました。 – mkacar

関連する問題