2016-07-28 6 views
0

XMLファイル内の既存の要素リストに新しい要素を追加しようとしています。私は要素を開始するためにこのコードを使用しています:VB.NETを使用して非ルートノードリストにXmlElementを追加する

Dim newElem As XmlElement = doc.CreateElement("/Content/Catalog/Feature[7]/Option") 

私は "/"文字を使用できないというエラーメッセージが表示されます。これを解決する方法は不明ですか?

更新: 私は2つのイメージを追加しています.1番目はXMLファイルのビューであり、データの格納場所です。ファイル:OriginalXML 青色の項目で強調表示されているものは、追加したいものです(リストの一番上にある必要はありません。 DisplayName、MultiMedia、およびCustomDataは、単純なCDATAテキストです。 2番目のファイルは、コードを実行したときの動作です。 (AfterCode.jpg)。強調表示された「オプション」が間違った場所にあるように見え、フォーマットが失われることに注意してください。あなたは、元のXMLファイルを見たい場合は は、ここにある: http://www.kwhdesign.ca/Temp/paf.xml

[OriginalXML] http://www.kwhdesign.ca/Temp/OriginalXML.jpg

(私は2つの以上のリンクを投稿することはできませんので、私は第2の画像をしてみてくださいよ!別のコメントで)

これは役に立ちます。 もう一度ありがとう!

答えて

0

あなたがそれをしたい場所AppendChildでそれを追加し、要素を作成します。

Dim newElem As XmlElement = doc.CreateElement("Option") 
doc.SelectSingleNode("/Content/Catalog/Feature[7]").AppendChild(newElem) 

UPDATE

をそれはあなたがやりたいと思っているものはまだ完全には明らかではないのですが、あなたがしたい場合最後の既存の<Option>の後に新しい<Option>要素を挿入すると、このようなものが開始になりますが、これはいかに面倒であるかを示していると思います(ただし、g新しいオプションを作成する)!

Dim newOption = doc.CreateElement("Option") 
newOption.SetAttribute("code", "ZZZ") 
Dim displayName = doc.CreateElement("DisplayName") 
displayName.SetAttribute("lang", "en-US") 
displayName.AppendChild(doc.CreateCDataSection("This is a test")) 
newOption.AppendChild(displayName) 
Dim feature = doc.SelectSingleNode("/Content/Catalog/Feature[7]") 
Dim lastOption = feature.SelectSingleNode("Option[last()]") 
feature.InsertAfter(newOption, lastOption) 

@dbasnettと同じように、私はXMLにXDocument/XElementとLINQを好むだろう。私は多くのXMLを操作するためのXElementを使用して好む

Dim doc = XDocument.Load("paf.xml") 
doc.<Content>.<Catalog>.<Feature>(6).<Option>.Last().AddAfterSelf(
    <Option code="ZZZ"> 
    <DisplayName lang="en-US"><![CDATA[This is a test]]></DisplayName> 
    <Multimedia type="MediumImage"><![CDATA[Multimedia\Pictures\Medium\SherwinWilliams.jpg]]></Multimedia> 
    <Multimedia type="LargeImage"><![CDATA[Multimedia\Pictures\Large\SherwinWilliams.jpg]]></Multimedia> 
    <CustomData><![CDATA[<xml> 
    <RECKEY code="010201650004001V" /> 
    <VARProp VarID="1237" PropID="Expression" Expr="SHERW" /> 
    <VARProp VarID="3518" PropID="Expression" Expr="SHERW" /> 
    <VARProp VarID="3580" PropID="Expression" Expr="SHERW" /> 
    <VARProp VarID="2149" PropID="VariableType" Expr="104" /> 
</xml>]]></CustomData> 
    </Option> 
) 
+0

お返事ありがとうございます。なぜこれが機能していないのか分かりませんが、xmlファイルのフォーマットも混乱しているようです。 多分私は明確にすることができます: 私はこれを持っています: //コンテンツ/カタログ/機能[7] /オプション[1]/code = ABC //コンテンツ/カタログ/機能[7] /オプション[2]/code = DEF ... etc to Option [68] 追加したいと思います: //コンテンツ/カタログ/機能[7] /オプション[1]/code = ZZZ ちなみに "code"は属性です問題) ご協力いただきありがとうございます。 – kman

+0

@kmanあなたが達成しようとしていることを示すために質問を更新すると助けになります。XMLの例の前後に、必要なものとその動作の仕方を示します。 – Mark

+0

メッセージを更新しました。 ここに第2の画像リンクがあります: [link] http://www.kwhdesign.ca/Temp/AfterCode.jpg – kman

0

:新しい<Option>を追加すると、この(インデックスが0のXPathとは異なり、ここに基づいていることに注意してください)のようなものになるだろう。次に、xelementを使用した例を示します。いくつかのデバッグステートメントがあるので、各ステップで何が起こっているかを見ることができます。それが役に立てば幸い。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 

    Dim xe As XElement 
    'to load from a file 
    ' xe = XElement.Load("Your Path Here") 

    'for testing you can do this 
    xe = <content> 
      <Catalog> 
       <feature></feature> 
       <feature></feature> 
       <feature></feature> 
       <feature></feature> 
      </Catalog> 
     </content> 

    'to add an element to the base 

    Debug.WriteLine("") 
    Debug.WriteLine(xe.ToString) 

    xe.AddFirst(New XElement("foo")) 

    Debug.WriteLine("") 
    Debug.WriteLine(xe.ToString) 

    'to add an element to sub element 
    Dim optProto As XElement = <option></option> 
    Dim addthis As New XElement(optProto) 'note New 
    xe.<Catalog>...<feature>.ElementAt(3).Add(addthis) 

    Debug.WriteLine("") 
    Debug.WriteLine(xe.ToString) 

    addthis.Value = "added" 'note 

    Debug.WriteLine("") 
    Debug.WriteLine(xe.ToString) 

End Sub 
+0

ありがとうございますdbasnett。私はXelementを使うのではなく、XmlDocumentを使いたいと思っています。私はXElementを使用しようとしましたが、私が望む結果を得ることができましたが、単一のノードの値を読み取る方法やノードの数をカウントする方法など、他の問題を発見しました。その2つの簡単な機能をどうやって行うのか分かりませんでした。もう一度おねがいしますが、XElementに戻ることになります。 – kman

関連する問題