如何在一个xml文件中检查子节点是否等于另一个xml文件中的节点?

时间:2018-01-23 23:03:57

标签: c# xml

我需要频繁生成XML(A)

XML(A)的结构不可更改。我只能更改XML(B)。另外,我可以将XML(B)存储在其他file/database/...

生成XML(A)时。我需要检查<id></id>中的XML(A)的一个子节点(XML(B))是否在我的XML(B)中。

  • 当我在XML(A)时,我想删除XML(B)中的整个父节点。

  • 当它不在我的XML(A)时,我想在XML(B)中添加<OPENCD> <label> <name>Alpha</name> <cd> <id>123</id> </cd> </label> <label> <name>BETA</name> <cd> <id>789</id> </cd> </label> <label> <name>GAMMA</name> <cd> <id>456</id> </cd> </label> </OPENCD> 的子节点。

XML(A-之前)

<objektid>
<id>123</id>
<id>456</id>
</objektid>

XML(B-之前)

<OPENCD>
<label>
<name>BETA</name>
<cd>
<id>789</id>
</cd>
</label>
</OPENCD>

结果应如下所示

XML(A-后)

<objektid>
<id>123</id>
<id>456</id>
<id>789</id>
</objektid>

XML(B-后)

namespace ConsoleApp16
{
   class Program
   {
       static void Main(string[] args)
       {
           XNodeEqualityComparer comparer = new XNodeEqualityComparer();
           XDocument docA = XDocument.Load("XMLA.xml");
           XDocument docB = XDocument.Load("XMLB.xml");
           Dictionary<int, XNode> nodeDictionary = new Dictionary<int, XNode>();

           SchleifeB();
           SchleifeA();
           docA.Save("XMLA.xml");
           Console.ReadLine();

           void SchleifeB()
           {
               foreach (XNode nodeB in docB.Elements("objektid").Elements("id"))
               {
                   int hash = comparer.GetHashCode(nodeB);

                   nodeDictionary.Add(hash, nodeB);
                   Console.WriteLine("Eintrag in Dictonary hinzugefügt B");
                   Console.WriteLine(nodeB);                        
               }
           }

           void SchleifeA()
           {
               foreach (XNode nodeA in docA.Elements("OPENCD").Elements("label").Elements("cd").Elements("id"))
               {
                   int hashA = comparer.GetHashCode(nodeA);
                   if (nodeDictionary.ContainsKey(hashA))
                   {
                       Console.WriteLine("Duplikat gefunden A");
                       Console.WriteLine(nodeA);
                       nodeA.Parent.Parent.Remove();
                       //nodeA.Parent.Parent.Remove(); breaks the foreach. But I want it to loop trough each element to the end of my xmlA.
                   }
                   else
                   {
                       nodeDictionary.Add(hashA, nodeA);
                       Console.WriteLine("Eintrag in Dictonary hinzugefügt A");
                       Console.WriteLine(nodeA);
                       //Here I will add that nodeA gets pasted into XMLB
                   }
               }
           }
       }
   } 
}

我的Testcode现在看起来像这样: THX cptwonton为您提供XDocument的建议。

node.parent.parent.Remove();

问题是XML(A)打破了foreach循环,只有第一个找到的副本在; Added CA file path curl.cainfo = "{REPLACE WITH FILE PATH}/cacert.pem"中被删除。

1 个答案:

答案 0 :(得分:0)

您可以采取的一种方法是:

  • 使用XElement库的Load方法解析XML A和XML B文件。结果你会得到两个字符串。
  • 执行比较(查看A中的id是否在B中,等等)。一种方法是使用正则表达式,但这可能是矫枉过正。你可能只使用string.contains()方法就好了。
  • 修改XML A和XML B的字符串表示
  • 完成后将字符串写回XML

或者,您可以使用XmlDocument库直接读取和操作XML文档。有关于如何在线完成此操作的指南。

如果我是你,我会使用XmlDocument库。