3

下面是我的 XML 示例:

<Customers>
  <Customer Id="1" Name="abc"/>
  <Customer Id="2" Name="efg"/>
</Customers>

如何使用 XElement 在此 XML 中更新?

<Customer Id="1" Name="aaabbbccc"/>

以及如何在这个 xml 中添加新行?

<Customers>
  <Customer Id="1" Name="abc"/>
  <Customer Id="2" Name="efg"/>
  <Customer Id="3" Name="test"/>
</Customers>

而且,如何获得指定的名称?例如,如果 1 则 abc,如果 2 则 efg

抱歉,我不知道,XML 和 XElement 的新手。

4

3 回答 3

9

我建议使用 LINQ to XML(在命名空间中System.LinqSystem.Xml.Linq

// Load Xml
string xml = "";
XDocument doc = XDocument.Parse(xml);

// Get and modify element
if (doc.Root != null)
{
    var elementToModify = doc.Root.Elements("Customer").SingleOrDefault(x => x.Attribute("Id").Value == "2");
    if (elementToModify != null) elementToModify.SetAttributeValue("Name", "aaabbbccc");
}

// Add new Element
XElement customer = doc.Descendants("Customers").FirstOrDefault();
if (customer != null) customer.Add(new XElement("Customer", new XAttribute("Id", 3), new XAttribute("Name", "test")));

// OR (maddy's answer)
doc.Element("Customers").Add(new XElement("Customer", new XAttribute("Id", 3), new XAttribute("Name", "test")));

// OR (Richard's answer)
doc.Root.LastNode.AddAfterSelf(new XElement("Customer", new XAttribute("Id", 3), new XAttribute("Name", "test")));

编辑:

// Get the Name attribute for a specified Id.
XElement element = doc.Root.Elements("Customer").Single(x => x.Attribute("Id").Value == "1");
string name = element.Attribute("Name").Value; // will be "abc"
于 2013-08-22T07:25:46.163 回答
2

检查这些可以提供很大帮助的链接(使用 linq 是最好的方法之一):

  1. 使用 linq 将数据添加到现有的 xml 文件
  2. 使用 linq to XML 将元素添加到 XML
  3. 使用 LINQ 插入新的 XML 节点

作为一个例子,我刚刚做了:

    string customers = "<Customers><Customer Id=\"1\" Name=\"abc\"/><Customer Id=\"2\" Name=\"efg\"/></Customers>";
    XDocument doc = XDocument.Parse(customers);
    XElement element = new XElement("Customer", new XAttribute("Id", "3"), new XAttribute("Name", "test"));
    doc.Element("Customers").Add(element);
    doc.Save(xmlfilepath);

修改:

    var myElement = doc.Elements("Customers").Elements("Customer").Where(el => el.Attribute("Id").Value == "2").SingleOrDefault();
    if (myElement != null)
        myElement.SetAttributeValue("Name", "aaabbbccc");
于 2013-08-22T07:24:42.707 回答
0

您正在使用 LINQ to XML,这可能是 .NET XML API 中最容易使用的:

对于第一部分:更新属性的值,您需要获取属性的XAttribute实例Name并更改其值:

custElement.Attribute("Name").Value = "aaabbbccc";

假设CustElement是正确的<Customer>元素。

对于第二部分:追加另一个元素,使用(parent of ) 的方法在另一个元素之后插入一个元素,因此给定一个元素:AddAfterSelfXNodeXElementrootElementXElement<Customers>

rootElement.LastNode.AddAfterSelf(new XElement("Customer",
                                               new XAttribute("Id", 3),
                                               new XAttribute("Name", "test")));

(构造函数的第一个参数XElement是它的名称,后面的参数是内容——属性(在本例中)或子节点。有多种其他方法可以做到这一点:例如Add(object),附加到XElement包装<Customers>元素,但在实践一个人倾向于有自己的偏好并坚持下去(一个小的一致性使代码更简单一些)。

对于第三部分:通过 id 获取客户,我们可以使用 LINQ 理解表达式:

var matches = (from cust in customersElement.Elements("Customer")
              where (int)cust.Attribute("Id") == theTargetId
              select cust)
              .Single();

(如果找到不完全匹配的任何内容,这将抛出,用于在未找到SingleOrDefault时返回null。)

于 2013-08-22T07:30:36.587 回答