2017-07-15 5 views
0

XML要素<Contact>だけを削除しようとしていますが、そのIDはlstBox Selected Indexと一致します。コードは実行されますが、実際にはXMLファイル内のすべてが削除されるため、空のtxtファイルが残っています。私はこのようなコードを持っている:XMLはC言語で削除される

private async void btnDeleteContact_Click(object sender, RoutedEventArgs e) 
    { 
     StorageFile file = await Windows.Storage.ApplicationData.Current.LocalFolder.GetFileAsync("Contacts.xml"); 
     XDocument xdoc = XDocument.Load(file.Path); 
     if (lstBox.SelectedIndex != -1) 
     { 
      xdoc.Element("Contacts") 
       .Elements("Contact") 
       .Where(x => (string)x.Attribute("ID") == lstBox.SelectedItem.ToString()).Remove(); 
      lstBox.SelectedIndex = -1; 
      updateXMLFile(xdoc); 
     } 
    } 

これは私のXMLファイルリストボックスの選択が青色である

<?xml version="1.0" encoding="UTF-8" ?> 
<Contacts> 
    <Contact> 
     <ID>salpea</ID> 
     <FirstName>Sally</FirstName> 
     <LastName>Pearson</LastName> 
     <Mobile>0431529562</Mobile> 
     <Email>[email protected]</Email> 
    </Contact> 
    <Contact> 
     <ID>gresul</ID> 
     <FirstName>Greg</FirstName> 
    <LastName>Sullivan</LastName> 
     <Mobile>0432928381</Mobile> 
     <Email>[email protected]</Email> 
    </Contact> 
    <Contact> 
     <ID>chrmac</ID> 
     <FirstName>Christie</FirstName> 
    <LastName>Mack</LastName> 
     <Mobile>0421231231</Mobile> 
     <Email>[email protected]</Email> 
    </Contact> 
</Contacts> 

です。

enter image description here

わからないそれが関連しているが、これはhere

おかげ問題に関する任意のヘルプファイル全体のための私のペーストビンである場合。

+0

あなたはC#を使用していますか? –

+1

あなたのXMLファイルでは、 ' ...'は* XML要素ではない* XML属性*だから '(文字列)x.Attribute(" ID ")== lstBox.SelectedItem.ToString()'は常に偽です。そして、実際には、テストでは何も削除されていないようです。だから私は問題が実際には 'updateXMLFile(xdoc);だと思う。あなたはそのコードを共有できますか? – dbc

+1

「chrmac」というIDの要素を削除しようとすると、何も表示されないデモが行われます。https://dotnetfiddle.net/T6ffsH – dbc

答えて

1
private async void btnDeleteContact_Click(object sender, RoutedEventArgs e) 
    { 
     StorageFile file = await Windows.Storage.ApplicationData.Current.LocalFolder.GetFileAsync("Contacts.xml"); 
     XDocument xdoc = XDocument.Load(file.Path); 
     if (lstBox.SelectedIndex != -1) 
     { 
      var id = lstBox.SelectedItem.ToString(); 
      XmlNode node = xdoc.SelectSingleNode(string.Format("/Contacts/Contact[@ID='{0}']", id)); 

      if (node != null) 
      { 
       XmlNode parent = node.ParentNode; 
       parent.RemoveChild(node); 
       updateXMLFile(xdoc); 
      } 
     } 
    } 
+0

こんにちは私はこれを試してみましたが、XDocumentにはSelectSingleNodeという値が含まれていないということが続きます。私は参照を追加しようとしましたが、それも動作しませんでした。 – Rick1990

+0

https://stackoverflow.com/questions/35089399/selectsinglenode-is-giving-compilation-error-in-dnx-core-5-0ヘルプ? – mjwills

1

ただし、xmlNodeを使用できます。私はhereからの基準をとっている。この

XmlTextReader reader = new XmlTextReader(path); 

    XmlDocument doc = new XmlDocument(); 
    XmlNode node = doc.ReadNode(reader); 

    foreach (XmlNode chldNode in node.ChildNodes) 
    { 
     string employeeName = chldNode.Attributes["Name"].Value; 
     if (employeeName == Employee) 
     {      
      //******your code here 
     } 
    } 

ダミーXML

<Root> 
    <Employee Name ="TestName"> 
    <Childs/> 
</Root> 

ようxmlNodeを使用して同様の要件を経て固定しています。あなたの文脈では、一致した場合に子ノードを削除することができます。

あなたのお役に立てば幸いです。

1

私は皆さんから回答を受け取りましたが、これで作業が終了しました。

private async void updateXMLFile(XDocument xdoc) 
     { 
      try 
      { 
       //StorageFile file = await installedLocation.CreateFileAsync("Contacts.xml", CreationCollisionOption.ReplaceExisting); 
       StorageFile file = await Windows.Storage.ApplicationData.Current.LocalFolder.GetFileAsync("Contacts.xml"); //This line was the replacement for the one above. 
       await FileIO.WriteTextAsync(file, xdoc.ToString()); 
      } 
      catch (Exception ex) 
      { 
       String s = ex.ToString(); 
      } 
     } 

はまた助けたすべての人々にx.Attribute to x.Element

感謝から変更します。

関連する問題