Java 比较xquery中的两个xml文件内容

Java 比较xquery中的两个xml文件内容,java,xml,xquery,basex,Java,Xml,Xquery,Basex,我试图创建一个新的xml文件,但没有给出任何路径,这意味着它不应该存储在我的SystemDisk中。请参见NewXML类。现在我想将这个xml检查到数据库“db”中,如果它存在,那么将这个xml文件的内容与数据库“db”中现有的xml文件的内容进行比较,如果内容相同,那么它应该返回true,否则返回false。请参阅类CheckXML 请注意,为什么我不想将新的xml文件存储到磁盘中,因为如果文件存储在磁盘中,那么首先我需要读取它,然后我们可以将其与数据库中的现有文件进行比较,这是不可行的解决方

我试图创建一个新的xml文件,但没有给出任何路径,这意味着它不应该存储在我的SystemDisk中。请参见NewXML类。现在我想将这个xml检查到数据库“db”中,如果它存在,那么将这个xml文件的内容与数据库“db”中现有的xml文件的内容进行比较,如果内容相同,那么它应该返回true,否则返回false。请参阅类CheckXML

请注意,为什么我不想将新的xml文件存储到磁盘中,因为如果文件存储在磁盘中,那么首先我需要读取它,然后我们可以将其与数据库中的现有文件进行比较,这是不可行的解决方案。当我们试图比较数百万个xml文件时,会出现性能问题。 所以请各位,任何人都可以解决这个问题。如果你有任何其他方法,请告诉我

public class NewXML
{

    /**
     * @param args
     * @throws QueryException 
     * @throws BaseXException 
     */
    public static void main(String[] args) 
    {

        CheckXML cXml=new CheckXML();
        System.out.println("Enter value to create the records:");
        Scanner kb=new Scanner(System.in);

        int i = kb.nextInt();
        try 
        {
                DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

                // root elements
                Document doc = docBuilder.newDocument();


                Element rootElement = (Element) doc.createElement("ABC");
                doc.appendChild(rootElement);

                // staff elements
                Element staff = doc.createElement("DEV");
                rootElement.appendChild(staff);

                // set attribute to staff element
                String id=String.valueOf(i);


                Attr attr = doc.createAttribute("id");
                attr.setValue(id);
                staff.setAttributeNode(attr);

                // shorten way
                // staff.setAttribute("id", "1");

                // firstname elements
                String fn="yong"+i;


                Element firstname = doc.createElement("firstname");
                firstname.appendChild(doc.createTextNode(fn));
                staff.appendChild(firstname);

                // lastname elements
                String ln="mook kim"+i;

                Element lastname = doc.createElement("lastname");
                lastname.appendChild(doc.createTextNode(ln));
                staff.appendChild(lastname);

                // nickname elements
                String nicknm="mkyong"+i;

                Element nickname = doc.createElement("nickname");
                nickname.appendChild(doc.createTextNode(nicknm));
                staff.appendChild(nickname);

                // salary elements
                Element salary = doc.createElement("salary");
                salary.appendChild(doc.createTextNode("100000"));
                staff.appendChild(salary);

                //target name
                //Node node=dom.c


                // write the content into xml file
                TransformerFactory transformerFactory = TransformerFactory.newInstance();
                Transformer transformer = transformerFactory.newTransformer();

                transformer.setOutputProperty(OutputKeys.INDENT, "yes");
                transformer.setOutputProperty(OutputKeys.METHOD, "xml");
                transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
                transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "staff");
                transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");


                DOMSource source = new DOMSource(doc);


                String xmlfilename = "Staff_Member"+""+id+".xml";

                StreamResult result = new StreamResult(System.out);

                transformer.transform(source, result);

                System.out.println(xmlfilename);

            //""""""""""CHECK AND COMPARE XML FILE CONTENTS  INTO DATABASE""""""""""""  

              cXml.comparingXML(xmlfilename);




        }
        catch (ParserConfigurationException pce)
        {
            pce.printStackTrace();
        }
        catch (TransformerException tfe) 
        {
            tfe.printStackTrace();
        } catch (BaseXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (QueryException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }

}

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

public class CheckXML
{/*
    public static void main(String[] args) throws QueryException, IOException {
*/      DatabaseConnection processor = new DatabaseConnection();
//Database context.
        Context context = new Context();



      public void comparingXML(String xml) throws BaseXException, QueryException
      {

        System.out.println("\n* Open collection database");

        new Open("db").execute(context);

        String xmlFile=xml;

        System.out.println(xmlFile);

        // System.out.println("=================Comparing XML files====================");




        String query = "declare variable $xml-file as xs:string external;" +
                   "for $doc in collection('db')where matches(document-uri($doc), '" + xmlFile + "') return deep-equal($doc, $xml-file)";

        QueryProcessor proc = new QueryProcessor(query, context);

        proc.bind("xml-file", xmlFile);

        Result result = proc.execute(); // your result
        System.out.println(result);



  // ------------------------------------------------------------------------
        // Close the database context
        context.close();


        }



}

另外,您的问题包含太多冗余代码,不清楚您要显示什么。@argh键入您的注释您认为您是第一个遇到此类问题的人吗?他相当粗鲁。如果您认为它是重复的,那么请将其标记为重复。否则,最好什么也不说,而不是这样咄咄逼人的措辞。“这真的没有帮助任何人。”迪尔克并没有任何冒犯的意思,不管怎样,他还是把它移走了。至于主题,我建议搜索一个xml比较框架。例如,在这种情况下,我使用了XMLUnit中的类。不幸的是,我认为您的整个方法既不高效也不优雅。您只有少量的元素,因此使用一些简单的XPath检查是否已经存在具有特定名称、昵称和薪水的元素,而不是比较序列化的整个文档,将更容易、更高效。实际上,当您使用BaseX时,整件事都可以而且应该!可以使用BaseX中的XQuery更新和数据库模块来完成。使用它,您可以使用XQuery动态添加和转换新文档。看一看