【问题标题】:Load info from xml, save related (changed) info using c#从 xml 加载信息,使用 c# 保存相关(更改的)信息
【发布时间】:2012-04-03 04:36:52
【问题描述】:

朋友们, 我的学校项目有一个 xml 数据文件:

<patients>
<patient>
<regNo>2012/Mar/003</regNo>
<name>Jhon</name>
<add>Somewhere</add>
<mobile>0000</mobile>
.
.
.
<stay>2</stay>
<costofroom>100</costofroom>
<total>200</total>
</patient>
</patients>

我的 Windows 表单“EditPatients_Load”能够获取患者 Jhon 的所有信息,现在假设管理员需要更改表单中的一些信息并重新提交。

然后如何在同一个xml中将所有值写回Jhon的帐户 文件????

我无法编写逻辑代码,即使我检查节点 if (patients.paptient.name = "nameComboBox.text").... 如何确保我正在写其他值合适的地方?

Rgrdz,

【问题讨论】:

  • how to make sure that I'm writing other values on proper place 是什么意思?你能改写一下吗?
  • 写入写入位置是什么意思,您可以通过替换值来更新文件添加新数据或重写文件,在这种情况下,它将是具有更多数据的同一个文件
  • 抱歉回复晚了:我的意思是如何确保所有 winform 值的提交都会更新到特定的子节点(Jhon 的帐户)。 Bcoz 为了保持 xml 布局简单,我做了一个简单的:Root/parent then child1, child2, child3.... 节点布局

标签: c# xml winforms


【解决方案1】:

试试这个:

//string xml = 
            //@"<patients><patient><regNo>2012/Mar/003</regNo><name>Jhon</name><add>Somewhere
            //</add><mobile>0000</mobile><stay>2</stay><costofroom>100</costofroom><total>200</total>
            //</patient></patients>";
            XDocument xmlDoc = XDocument.Load(@"c:\abc.xml");
            var items = (from item in xmlDoc.Descendants("patient")
                         where item.Element("name").Value == "Jhon"
                         select item);
            if (items.Count() > 0)
            {
                var item = items.First();
                item.SetElementValue("add", "New New Address");
                xmlDoc.Save(@"c:\abc.xml", SaveOptions.None);
            }

您可以使用

获取单个元素
var item = (from item in xmlDoc.Descendants("patient")
                             where item.Element("name").Value == "Jhon"
                             select item).FirstOrDefault();

然后使用SetElementValue() 方法更新它。

//更新的Xml

<?xml version="1.0" encoding="utf-8"?>
<patients>
  <patient>
    <regNo>2012/Mar/003</regNo>
    <name>Jhon</name>
    <add>New Address</add>
    <mobile>0000</mobile>
    <stay>2</stay>
    <costofroom>100</costofroom>
    <total>200</total>
  </patient>
</patients>

参考:
Update XML with C# using Linq

【讨论】:

  • 亲爱的 Niranjan,我对代码的工作方式有点困惑。我很困惑......我不知道用户可以编辑哪个字段,所以我必须将所有字段重新写入 xml。但是,当我重新提交表单时,与患者 Jhon 相关的所有其他节点(如注册号、添加、移动设备等)是否会使用相同的示例代码进行更新?与此同时,我正在努力......
  • 您可以为特定用户更新所有内容,只需对项目使用 foreach 循环。并一一更新属性。 item.SetElementValue("add", txtAddress.Text); item.SetElementValue("mobile", txtMobile.Text); 像这样你也可以更新其他的.. 从 msdn 做一些学习。如果您对这些语句的处理感到困惑并在那里搜索堆栈溢出,您将得到很好的问题和解决方案示例。
  • 对不起...它对我不起作用:( foreach (items) { item.SetElementValue("add", txtBox2.Text); item.SetElementValue("mobile", txtBox3.Text) ); }
  • 更新 xml 文件时出错。代码Value == nameComboBox.Text 的小改动每次根据提交的表单数据只更改xml 文件&lt;patient&gt; 中的第一个条目。这是创建两个具有相同名称的记录。下拉列表没有显示重复的名称,但是当您选择该名称时,会获取两种不同类型的数据并在眨眼间一个接一个地显示。
  • 您一次只更新一行。所以最好使用item.SetElementValue("add", "New New Address");。根据我对您的表格的预测,您正在更新单个患者的详细信息。所以按照这个,它应该对你有用,而不是循环遍历元素。
【解决方案2】:

我会采取xml序列化/反序列化的方式来解决这个问题:

http://support.microsoft.com/kb/815813

How to Deserialize XML document

这样您就可以处理对象,而不必手动解析 xml 文件。

【讨论】:

  • 但这是行业标准方式。学校项目有时有不同的要求:-)
【解决方案3】:

如果您使用的是 .NET 3.5 向前,则可以使用 XDocument 类,如下所示。我假设您的内容在 .xml 文件中。

XDocument xdoc = XDocument.Load(@"C:\Tmp\test.xml");
//this would ensure you get the right node and set its text content/value
xdoc.Element("patients")
     .Element("patient").Element("add").Value = "some new address?";
xdoc.Save(@"C:\Tmp\test.xml");

文件test.xml 将更改为:

<patients>
 <patient>
  <regNo>2012/Mar/003</regNo>
  <name>Jhon</name>
  <add>some new address?</add>
  <mobile>0000</mobile>
  <stay>2</stay>
  <costofroom>100</costofroom>
  <total>200</total>
 </patient>
</patients>

【讨论】:

  • 亲爱的gideon,我试过这个解决方案,很容易理解,但问题是缺少搜索功能。我需要更新 xml 数据库中 Jhon 的所有记录。所以在我获取 Jhon 的记录之后,我必须用我的 winForm 文本框中的当前值覆盖它们。我正在寻找能够记住 Jhon 的兄弟节点的逻辑。您显示的 Xml 文件的布局是正确的,但我在 xml 文件中有很多患者详细信息。
猜你喜欢
  • 1970-01-01
  • 2017-12-29
  • 1970-01-01
  • 2012-01-20
  • 2013-05-09
  • 2020-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多