2016-05-11 10 views
0

データをテキストボックスに入力してボタンをクリックしてそのデータをXMLドキュメントに入力することにより、単純なXMLドキュメントを作成するツールをWPFから作成しようとしています。私は、親ステップを追加することができましたC#、特定の属性を持つノードに子ノードを追加しようとしています

<root> 
<step id="1"> 
    <P>some instructions</p> 
    <step id="1.1"> 
     <p>some additional instructions</p> 
    </step> 
</step> 
<step id="2"> 
    <p>second set of instructions</p> 
    <step id="2.1"> 
     <p>additional instructions for step 2</p> 
    </step> 
</step> 

しかし、私のサブステップのすべてが、最初の親に該当:ルート要素以外に、私はこのような子サブステップ要素とステップの要素を持っていますステップ:

<root> 
<step id="1"> 
    <step id="1.1"> 
    <step id="2.1"> 
    <step id="3.1"> 
<step id="2"> 
<step id="3"> 

サブステップを適切な親ステップに挿入しようとしています。しかし、私はエラーを受け取ります: "XAttributeには 'add'の定義がなく、拡張メソッド 'add'は最初の引数型 'XAttribute'を受け入れることができませんでした。

私は広範に調査しており、解決策を思い付くことができません。うまくいけば、これは意味があり、誰かが私に手を差し伸べることができます。前もって感謝します。ここに私のコードは次のとおりです。

using System.Windows; 
using System.Xml.Linq; 
using System.Xml.XPath; 

namespace XMLwpfTest1 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     XDocument doc = new XDocument(
      new XElement("Content", 
      new XElement("Title", "DM Title")) 
     ); 

     string par = "par-"; 

     int counter = 1; 
     int counter2 = 1; 
     string stepNumber = ""; 



     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void create_Click(object sender, RoutedEventArgs e) 
     { 
      doc.Element("Content").Add(
       new XElement("proceduralStep", 
       new XAttribute("id", par + counter.ToString("D4")), 
       new XElement("para", 
      dataBox.Text))); 
      stepNumber = par + counter.ToString("D4"); 
      counter += 1; 
      dataBox.Clear(); 
      counter2 = 1; 
     } 


     private void createSubStep_Click(object sender, RoutedEventArgs e) 
     { 

      var addStep = doc.XPathSelectElement("Content/proceduralStep").Attribute(stepNumber); 


      addStep.add(
      new XElement("proceduralStep", 
      new XAttribute("id", stepNumber + "-" + counter2.ToString("D4")), 
      new XElement("para", 
     subDataBox.Text))); 
      counter2 += 1; 
      subDataBox.Clear(); 
     } 

     private void save_Click(object sender, RoutedEventArgs e) 
     { 
      doc.Save(fileName.Text + ".xml"); 
      savedLabel.Visibility = Visibility.Visible; 
     } 
    } 
} 
+0

これは完全なXMLファイルですか? Content/proceduralStepとコンテンツはどこから来たのですか?私はxmlでそれらを見ることはできません – Sybren

+0

私が質問に入れたXMLは、私が探していた構造だけです。それらは実際のタグ名ではありません。私は実際のタグ名を使用しているはずです。混乱させて申し訳ありません。 は、作成される要素です。 – swm462

答えて

0

あなたの問題は、このラインに来る:

var addStep = doc.XPathSelectElement("Content/proceduralStep").Attribute(stepNumber); 

あなたはそのid属性値stepNumberを持つ<proceduralStep>を選択したいように見えます。 stepNumberユーザーが入力した文字列、あなたがして、インスタンスのために、XPath injectionを防ぐために注意する必要があるだろうしたら、

var addStep = doc.XPathSelectElement(string.Format("Content/proceduralStep[@id='{0}']", stepNumber)); 

注:XPathのでこれを行うには、次の構文[@attributeName='attributeValue']、すなわちを使用する必要がありますhereの指示に従ってください。

また、あなたはWhere式を追加することによって、使用してこれを行うことができます:

var addStep = doc.XPathSelectElements("Content/proceduralStep") 
    .Where(e => (string)e.Attribute("id") == stepNumber) 
    .FirstOrDefault(); 

XPathインジェクションは、このアプローチの問題ではありません。

(。あなたが現在呼び出しているメソッド、XElement.Attribute(XName)は、あなたが望んでいない、指定された名前を持つ属性を返す)

その後add()は正しくXElement.Add()として資産計上する必要があります

addStep.Add(
new XElement("proceduralStep", 
new XAttribute("id", stepNumber + "-" + counter2.ToString("D4")), 
new XElement("para", subDataBox.Text))); 
+0

私はこれまでと同じエラーメッセージを 'addStep.add'( ' – swm462

+0

@ swm462 - 'XElement'に' add() 'メソッドがありません。[' Add'](https:// msdn.microsoft.com/en-us/library/system.xml.linq.xelement.add(v=vs.110).aspx)。他の場所で正しく実行します。 – dbc

+0

あなたは正しいです!許してください、私はかなりですnoobish。それは私がそれが必要なものを正確に行います。ありがとう! – swm462

関連する問題