2012-08-11 84 views
0

这样我就可以获得记录的详细信息,并且我想知道如何编辑这些值并将其更新为相同的记录?xml中的更新记录

如何检查属性中的唯一值?

XDocument doc = XDocument.Load(filePath); 

string id = textBox6.Text; 
XElement element = doc.Descendants("Customer").FirstOrDefault(p => p.Attribute("id").Value == id); 

if (element != null) 
{ 
    //found 
    textBox6.Text = textBox6.Text; 
    textBox1.Text = (string)element.Element("FirstName"); 
    textBox2.Text = (string)element.Element("LastName"); 
    textBox3.Text = (string)element.Element("Mobile"); 
    textBox4.Text = (string)element.Element("Address"); 
    textBox5.Text = (string)element.Element("Country"); 
} 

示例XML:

<?xml version="1.0" encoding="utf-8"?> 
<CustomerRecord> 
    <Customer id="43543543"> 
    <FirstName>sdf</FirstName> 
    <LastName>fdsf</LastName> 
    <Mobile>23452345é</Mobile> 
    <Address>zfdsf</Address> 
    <Country>dsfdsf</Country> 
    </Customer> 
</CustomerRecord> 

回答

1
XElement element; 
XDocument doc; 

private void Load() 
{ 
    doc = XDocument.Load(filePath); 

    string id = textBox6.Text; 
    element = doc.Descendants("Customer").FirstOrDefault(p => p.Attribute("id").Value == id); 

    if (element != null) 
    { 
     //found 
     textBox6.Text = textBox6.Text; 
     textBox1.Text = (string)element.Element("FirstName"); 
     textBox2.Text = (string)element.Element("LastName"); 
     textBox3.Text = (string)element.Element("Mobile"); 
     textBox4.Text = (string)element.Element("Address"); 
     textBox5.Text = (string)element.Element("Country"); 
    } 
} 

protected void btnSave_Click(object sender, EventArgs e) 
{ 
    element.Attribute("id").Value = textBoxID.text; 
    var firstNameSimilarElement = doc.Descendants("FirstName").FirstOrDefault(fn => fn.Value == textBox1.Text) 
    if (firstNameSimilarElement != null && firstNameSimilarElement.Parent != element) 
    { 
     MessageBox.Show("First Name already exists"); 
    } 
    else 
    { 
     element.Element("FirstName").Value = textBox1.Text; 
    } 
    // Same for all fields 
    doc.Save(filePath); 
} 
+0

:我如何更新身份证? – linguini 2012-08-11 21:32:09

+0

刚刚更新了我的回答 – 2012-08-11 21:38:20

+0

@Genial,Merci。 – linguini 2012-08-11 21:40:46

0

您可以哈希节点的内容和哈希附加到生成的XML。哈希将是唯一足以充当您的记录的“主键”。

+0

:请详细解释我。 – linguini 2012-08-11 21:19:05

+0

在我看来,您正尝试'生成'某种类型的ID值,以根据此记录内容的唯一性获取唯一的句柄(id)给您的记录。如果您只需将所有客户的字段连接在一起(以字符串形式)并在结果字符串上调用'GetHashCode()',则会得到一个充当某种主键的数字(http://msdn.microsoft.com /en-us/library/system.string.gethashcode.aspx)。当然,这个数字并非最终唯一,但是如果将缩小结果集。从那里开始,逐场比较,缩小到您的独特记录。 – RedFury 2012-08-11 21:39:28

+0

好的,我正在阅读内容。谢谢。 – linguini 2012-08-11 21:41:56

1

例如,我只使用2个子节点(FirstName,LastName)。我用exe文件将file.xml放在同一目录中,这里是代码:

using System; 
using System.Windows.Forms; 
using System.Xml; 

namespace UpdateXmlRecord 
{ 
    public partial class Form1 : Form 
    { 
     private XmlDocument xDoc; 

     public Form1() 
     { 
      InitializeComponent(); 
      xDoc = new XmlDocument(); 
      xDoc.Load("file.xml"); 
     } 

     /// <summary> 
     /// Retrieve Xml Node 
     /// </summary> 
     /// <param name="sender"></param> 
     /// <param name="e"></param> 
     private void button1_Click(object sender, EventArgs e) 
     { 
      string id = txtId.Text; 
      string fName = "", lName = ""; 
      foreach (XmlElement element in xDoc.DocumentElement) 
      { 
       if (element.Name == "Customer" && element.Attributes["id"].Value == id) 
       { 
        foreach (XmlNode node in element) 
        { 
         if (node.Name == "FirstName") 
         { 
          fName = node.InnerText; 
         } 

         if (node.Name == "LastName") 
         { 
          lName = node.InnerText; 
         } 
        } 
       } 
      } 

      txtFName.Text = fName; 
      txtLName.Text = lName; 
     } 

     /// <summary> 
     /// Save Xml Node With Custom Value 
     /// </summary> 
     /// <param name="sender"></param> 
     /// <param name="e"></param> 
     private void button2_Click(object sender, EventArgs e) 
     { 
      string id = txtId.Text; 
      foreach (XmlElement element in xDoc.DocumentElement) 
      { 
       if (element.Name == "Customer" && element.Attributes["id"].Value == id) 
       { 
        foreach (XmlNode node in element) 
        { 
         if (node.Name == "FirstName") 
         { 
          node.InnerText = txtFName.Text; 
         } 

         if (node.Name == "LastName") 
         { 
          node.InnerText = txtLName.Text; 
         } 
        } 
       } 
      } 
      xDoc.Save("file.xml"); 
     } 
    } 
} 

希望它是有用的,喜欢它。 :)