更新XElement(或克隆的XElement)的子属性

时间:2010-10-17 17:03:50

标签: c# xml linq-to-xml

我有一个XML如下。

<AFConfig>
 <Geographies>
  <Geography id="Place1" description="NicePlace">
   <MetaData>
    <Services>
     <Service>
     ...
     ...
     </Service>
    </Services>
   </MetaData>
   <Systems>
    <DefaultSystem systemName="SYSONE" server=http"//192.168.0.0" />
   </Systems>
  </Geography>
 <Geographies> 
</AFConfig>

我想做的就是这个。

  1. 克隆元素Geography并将其添加为兄弟姐妹(即,Child to Geographies)
  2. 使用新值更新“id”,“description” AND
  3. 使用新值更新systemName
  4. 我的代码。

    XDocument xd_Document = XDocument.Load(s_FileName);
    XElement xe_Element = (from xe in xd_Document.XPathSelectElements(s_Element)
                           where xe.Attribute(s_IdAttr).Value == s_Value
                           select xe).SingleOrDefault();
    XElement xe_NewElement = CloneElement(xe_Element)
    foreach(KeyValuePair<string, string> s in d_AttrValue)
        xe_NewElement.Attribute(s.Key).Value = d_AttrValue[s.Key];
    xe_Element.Parent.Add(xe_NewElement);
    xd_Document.Save(s_destFileName);
    

    我将以下参数传递给此方法 string s_FileName,string s_destFileName,string s_Element,string s_IdAttr,string s_Value,Dictionary d_AttrValue

    使用此代码,我可以修改id和description属性。

    问题:如何使用值?

    修改DefaultSystem属性systemName

    注意:我对现有元素的修改具有相同的代码,而不是创建新元素。再次,我遇到了同样的问题。通用解决方案将是首选。

1 个答案:

答案 0 :(得分:0)

xe_NewElement.Element("Systems")
    .Element("DefaultSystem")
    .Attribute("systemName")
    .Value = "Enter your value here";

我相信应该做你需要的。

编辑:

var attribute = ((IEnumerable)xe_NewElement.XPathEvaluate("Systems/DefaultSystem/@systemName"))
    .Cast<XAttribute>().FirstOrDefault();

attribute.Value =“在此处输入您的值”;

通过传入xpath和值列表,一般允许你这样做。