Java 比较xquery中的两个xml文件内容
我试图创建一个新的xml文件,但没有给出任何路径,这意味着它不应该存储在我的SystemDisk中。请参见NewXML类。现在我想将这个xml检查到数据库“db”中,如果它存在,那么将这个xml文件的内容与数据库“db”中现有的xml文件的内容进行比较,如果内容相同,那么它应该返回true,否则返回false。请参阅类CheckXML 请注意,为什么我不想将新的xml文件存储到磁盘中,因为如果文件存储在磁盘中,那么首先我需要读取它,然后我们可以将其与数据库中的现有文件进行比较,这是不可行的解决方案。当我们试图比较数百万个xml文件时,会出现性能问题。 所以请各位,任何人都可以解决这个问题。如果你有任何其他方法,请告诉我Java 比较xquery中的两个xml文件内容,java,xml,xquery,basex,Java,Xml,Xquery,Basex,我试图创建一个新的xml文件,但没有给出任何路径,这意味着它不应该存储在我的SystemDisk中。请参见NewXML类。现在我想将这个xml检查到数据库“db”中,如果它存在,那么将这个xml文件的内容与数据库“db”中现有的xml文件的内容进行比较,如果内容相同,那么它应该返回true,否则返回false。请参阅类CheckXML 请注意,为什么我不想将新的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动态添加和转换新文档。看一看