如何在C#中更新XmlNode属性值

时间:2016-08-02 15:00:04

标签: c# xml xsd

我有一个像这样的XML文件:

<caseData>   
  <entity type="case" name="1">
    <attribute name="CASE_OPEN" value="false"/>
    <attribute name="CASE_NUMBER" value=""/>
    <attribute name="CASE_TYPE" value=""/> 
  </entity> 
<caseData>

我需要更新CASE_NUMBER和CASE_TYPE的值。我唯一能做的就是:

    _xd = new XmlDocument();
    _xd.LoadXml(xmlTemplate);
    var caseitem = _xd.GetElementsByTagName("entity")[0];
    var childnodes = caseitem.ChildNodes;
    foreach (XmlNode node in childnodes)
            {
                if (node.Attributes["name"].Value == "CASE_NUMBER")
                {
                    node.Attributes["value"].Value = "11222";
                }
                if (node.Attributes["name"].Value == "CASE_TYPE")
                {
                    node.Attributes["value"].Value = "NEW";
                }

            }

我想知道是否有更好的方法来做到这一点。 谢谢!

1 个答案:

答案 0 :(得分:1)

另一种选择是使用LINQ to XML。它通常是一个更好的API:

var doc = XDocument.Parse(xmlTemplate);

var caseNumber = doc
    .Descendants("attribute")
    .Single(e => (string)e.Attribute("name") == "CASE_NUMBER");

caseNumber.SetAttributeValue("value", "11222");

如果这真的是一个模板,而你只是填补了空白,你可以很容易地从头开始创建它:

var attributes = new Dictionary<string, string>
{
    {"CASE_OPEN", "false"},
    {"CASE_NUMBER", "11122"},
    {"CASE_TYPE", "NEW"}
};

var caseData = new XElement("caseData",
    new XElement("entity",
        new XAttribute("type", "case"),
        new XAttribute("name", "1"),
        AttributeElements(attributes)
    )
);

AttributeElements类似于:

private static IEnumerable<XElement> AttributeElements(
    IReadOnlyDictionary<string, string> attributes)
{
    return attributes.Select(x => new XElement("attribute",
        new XAttribute("name", x.Key),
        new XAttribute("value", x.Value)
    ));
}