Java 在不将所有比较数据加载到内存的情况下比较两组XML数据

Java 在不将所有比较数据加载到内存的情况下比较两组XML数据,java,xml,algorithm,comparison,sax,Java,Xml,Algorithm,Comparison,Sax,因此,我有两个XML文件正在被解析以获取信息。我正试图找到一种方法来确定一个XML文件中的哪些元素在另一个XML文件中丢失。现在,两个XML文件的结果都加载到两个不同的数组中,但这并不好,因为需要保留大量数据 我需要在不将所有数据永久加载到内存的情况下,以某种方式找出一个文件中缺少的内容,因为所讨论的XML文件可能非常大 下面是一个xml示例。假设另一个文件缺少一个弱点,我已经在使用SAX解析器来获取实际数据了 <weaknesses> <wakness status=

因此,我有两个XML文件正在被解析以获取信息。我正试图找到一种方法来确定一个XML文件中的哪些元素在另一个XML文件中丢失。现在,两个XML文件的结果都加载到两个不同的数组中,但这并不好,因为需要保留大量数据

我需要在不将所有数据永久加载到内存的情况下,以某种方式找出一个文件中缺少的内容,因为所讨论的XML文件可能非常大

下面是一个xml示例。假设另一个文件缺少一个弱点,我已经在使用SAX解析器来获取实际数据了

 <weaknesses>
   <wakness status="new" severity="low" id="14876">
     <cwe id="133" href="http://cwevis.org">Title1</cwe>
       <tool code="STRING" category="PERFORMANCE" name="aaa"/>
        <rule name="Method invokes inefficient new String(String) constructor"/>
         <locations>
         <location path="Catcher.java" type="file">
         <line end="93" start="93"/>
          <description>stuff</description>
         </location>
         </locations>
    </weakness>

   <weakness status="new" severity="low" id="14877">
     <cwe id="138" href="http://cwevis.org">Title2</cwe>
       <tool code="PARAMETER" category="SECURITY" name="bbb"/>
        <rule name="Servlet parameters unsafe"/>
         <locations>
          <location path="Catcher.java" type="file">
         </locations>
   </weakness>

   <weakness status="new" severity="low" id="14878">
     <cwe id="500" href="http://cwevis.org">Title3</cwe>
       <tool code="FINAL" category="asd" name="vvv"/>
         <rule name="Field isn't final and can't be protected from malicious code"/>
          <locations>
           <location path="Course.java" type="file">
           <line end="56" start="56"/>
           <description>stuff </description>
           </location>
          </locations>
   </weakness>
 </weaknesses>

标题1
东西
标题2
标题3
东西

注意:我正在用Java编程,并假设元素没有排序。我想到的两个想法是加载两个集合并将一个集合与另一个集合进行比较的简单方法,这两个集合解决了内存问题。另一种方法是在不存储任何东西的情况下反复解析xml,但这一过程非常低效。

假设您将xmlfile A与B进行比较。在解析文件A时,首先用所有A元素填充集合X;解析文件B时,尝试从堆栈X中删除找到的任何元素。如果您得到
true
(它已从集合中删除),则继续。如果得到
false
(它不在集合X中),则将其保存在集合Y中。在解析文件B的末尾,堆栈X将包含A中的所有元素,而不是B中的所有元素;堆栈Y将包含B中不在A中的所有元素


这要求您实现一个实体类来实现弱点对象,该对象实现
等于
(对于remove调用),并最终实现
可比
接口(排序集合可能更适合此问题的某些维度).

您需要深入检查
weekness
元素以确定它们是否相等,还是只是比较id?经过思考,我认为id可以工作,然后我会搜索该id并提取其各自的数据。创建一个包含需要检查的元素的类,实现equals;解析填充该类集合的第一个文件;关闭并解析从该集中删除的第二个文件;时间复杂度是n+m(最坏情况),空间是n(乘以comaraison类实例的字节),谢谢!这是个好主意,如果你做一个正式的回答,我会接受的。老实说,我不是很想为你写代码,你会在这个网站上找到很多零碎的东西。只需在可用java集合中选择最合适的数据结构。如果你有麻烦,回来问一个更具体的问题