按元素内容选择xml节点

时间:2015-02-25 14:04:55

标签: c# xml

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

    <root>
       <sub>
          <name>Al</name>
          <code>001</code>
       </sub>
       <sub>
          <name>John</name>
          <code>002</code>
       </sub>

List<string> lName= new List<string>(new string[] { "Jack", "John"});

我想编辑“John”节点,添加“Jack”节点并按原样保留“Al”节点。我做的是:

System.Xml.XmlNodeList nodeNameList = FileXml.SelectNodes(@"//*[contains(name(),'name')]");
foreach (string name in lName)
{
   System.Xml.XmlNode nodeName=FileXml.SelectSingleNode("//root/sub/name");                 
   if (nodeName.InnerText == name)
   {
        //add
   }
   else
   {
        //edit              
   }

但它不起作用。我认为XmlNodeList可以作为普通列表使用,但事实并非如此。有人能帮助我吗?

2 个答案:

答案 0 :(得分:1)

您可以将xml加载到Document中,然后将Descendants与节点名一起使用,然后使用Where对其应用Contins过滤器。你可以尝试这样的事情,

    XDocument xmlDocument = XDocument.Load(@"yourxmlpath.xml");
    var result = xmlDocument.Descendants("sub")
                .Where(x => lName.Contains(x.Element("name").Value)).ToList();

答案 1 :(得分:0)

你在这里遇到了几个问题。

首先,您将XmlNode与使用以下代码的字符串进行比较:

if (nodeName == name)

永远不会评价为真。你想要像

这样的东西
if (nodeName.InnerText == name)

对于你的添加逻辑,你需要创建一个新的XmlNode并附加它(参见https://msdn.microsoft.com/en-us/library/system.xml.xmlnode.appendchild%28v=vs.110%29.aspx)。对于更新逻辑,只需在节点上设置InnerText属性。