如何检查另一个节点的子节点中是否存在XML节点?

时间:2015-06-26 15:11:40

标签: c# xmldocument xmlnode

如果它不包含此节点,我想将XmlNode添加到另一个XmlNode(比较应该基于节点名称及其内容)

System.Xml.XmlDocument doc;
...
XmlNode newNode = doc.CreateElement(name);
newNode.InnerXml = something
XmlNode parentNode = doc.GetElementsByTagName(parentName);
if (parentNode.???? (newNode))
{
    parentNode.AppendChild(newNode);
}

我如何检查这种存在? parentNode.ChildNodes没有Contain方法。

2 个答案:

答案 0 :(得分:2)

您可以使用LINQ to XML来使用XNode.DeepEquals方法来比较您的子节点是否相等。示例可能如下所示 - duplicateChild不会被添加,但newChild将是:

var doc = new XDocument(
    new XElement("parent",
        new XElement("child", 1)));

var parent = doc.Descendants("parent").Single();

var duplicateChild = new XElement("child", 1);
var newChild = new XElement("child", 2);

if (!parent.Elements().Any(e => XNode.DeepEquals(e, duplicateChild)))
{
    parent.Add(duplicateChild);
}

if (!parent.Elements().Any(e => XNode.DeepEquals(e, newChild)))
{
    parent.Add(newChild);
}

此处的演示:https://dotnetfiddle.net/1t4Q1b

答案 1 :(得分:1)

我认为这会解决问题:

    private void doSomething() 
    {
        XmlDocument doc = new XmlDocument();
        XmlNode newNode = doc.CreateElement("name");
        newNode.InnerXml = "something";
        XmlNode parentNode = doc.GetElementsByTagName("parentName")[0]; 
            // I just stuck an index on end of above line... 
            // Note that GetElementsByTagName returns an XmlNodeList

        int huh = 0;
        foreach (XmlNode n in parentNode.ChildNodes)
        {
            // If I understood you correctly, you want these checks?
            if (n.InnerXml == newNode.InnerXml && n.Name == newNode.Name) huh++;
        }

        if (huh == 0) parentNode.AppendChild(newNode);
    }