Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java比较和合并XML文件中的两个字符串_Java_Xml_Merge_Compare - Fatal编程技术网

使用Java比较和合并XML文件中的两个字符串

使用Java比较和合并XML文件中的两个字符串,java,xml,merge,compare,Java,Xml,Merge,Compare,我有两个xml文件,它们存储为字符串。我想比较每个xml文件中的特定字符串,如果这些字符串匹配,我需要将它们合并为Java中的单个xml文件: file1.xml: <docs> <doc> <id>102</id> <name>Samsung</name> <brand>S3</brand> </doc> </docs> <docs

我有两个xml文件,它们存储为字符串。我想比较每个xml文件中的特定字符串,如果这些字符串匹配,我需要将它们合并为Java中的单个xml文件:

file1.xml:

<docs>
  <doc>
    <id>102</id>
    <name>Samsung</name>
    <brand>S3</brand>
  </doc> 

</docs>
<docs>
  <doc>
    <id>102</id>
    <name>Samsung</name>
    <brand>S3</brand>
    <stock>10</stock>
  </doc>
</docs>
我想用Java比较两个XML文件中的ID(即102),如果匹配,那么我想在一个XML文件中得到以下输出

output.xml:

<docs>
  <doc>
    <id>102</id>
    <name>Samsung</name>
    <brand>S3</brand>
  </doc> 

</docs>
<docs>
  <doc>
    <id>102</id>
    <name>Samsung</name>
    <brand>S3</brand>
    <stock>10</stock>
  </doc>
</docs>

102
三星
S3
10

请为我提供一个确切的代码,因为我对这个主题非常陌生。如果可能,请尝试在不使用循环语句的情况下给我一个答案

您可以根据需要尝试此示例。
SAXHandler
是处理程序类,它将在
docsList
中解析XML后收集所有
Doc
对象

class SAXHandler extends DefaultHandler {
    List<Doc> docsList = new ArrayList<>();
    Doc doc = null;
    String content = null;

    @Override
    public void startElement(String uri, String localName,
                             String qName, Attributes attributes)
            throws SAXException {

        switch(qName){
            //Create a new Doc object when the start tag is found
            case "doc":
                doc = new Doc();
                doc.id = attributes.getValue("id");
                doc.name = attributes.getValue("name");
                doc.brand = attributes.getValue("brand");
                doc.stock = attributes.getValue("stock");
                break;
        }
    }

    @Override
    public void endElement(String uri, String localName,
                           String qName) throws SAXException {
        switch(qName){
            case "doc":
                docsList.add(doc);
                break;
            case "id":
                doc.id = content;
                break;
            case "name":
                doc.name = content;
                break;
            case "brand":
                doc.brand = content;
                break;
            case "stock":
                doc.stock = content;
                break;
        }
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        content = String.copyValueOf(ch, start, length).trim();
    }

}
主类是
XMLFileReadAndMergeUsingSAX
,它将上述两个类作为嵌套类包含

public class XMLFileReadAndMergeUsingSAX {

    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
        SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
        SAXHandler handler1 = new SAXHandler();
        SAXHandler handler2 = new SAXHandler();
        InputStream is1 = XMLFileReadAndMergeUsingSAX.class.getResourceAsStream("abc.xml");
        InputStream is2 = XMLFileReadAndMergeUsingSAX.class.getResourceAsStream("def.xml");
        parser.parse(is1, handler1);
        parser.parse(is2, handler2);
        List<Doc> finalList = new ArrayList<>();
        // Print first xml for verification
        for (Doc doc1 : handler1.docsList) {
            System.out.println(doc1);
        }
        // Print second xml for verification
        for (Doc doc1 : handler2.docsList) {
            System.out.println(doc1);
        }

        for (Doc doc1 : handler1.docsList) {
            for (Doc doc2 : handler2.docsList) {
                if(doc1.id.equals(doc2.id)) {
                    Doc newDoc = new Doc();
                    newDoc.id = doc1.id;
                    newDoc.name = (doc1.name != null) ? (doc1.name) : (doc2.name);
                    newDoc.brand= (doc1.brand != null) ? (doc1.brand) : (doc2.brand);
                    newDoc.stock = (doc1.stock != null) ? (doc1.stock) : (doc2.stock);
                    finalList.add(newDoc);
                }
            }
        }

        //Now print final xml.
        for(Doc doc : finalList) {
            System.out.println(doc);
        }

    }
}
如果您想在没有循环的情况下尝试此操作,则可以尝试创建映射并插入/更新结果。如果你想了解基本知识,那么这是一个很好的参考

如果您希望将XML保持为字符串形式,您可以获取以下信息:

String xml2 = "<docs><doc><id>102</id><name>Samsung</name><brand>S3</brand></doc></docs>";
InputStream in = new ByteArrayInputStream(xml1.getBytes("utf-8"));
String xml2=“102SamsungS3”;
InputStream in=newbytearrayinputstream(xml1.getBytes(“utf-8”);

我没有尝试过,但它应该可以工作。

我不知道从哪里开始。.我尝试了很多东西,但都没有成功,所以我从头开始。您是如何读取XML文件的?您是否尝试过DOM parser()。问题是,shld不使用DOM parser。需要在没有DOM parser的情况下获取输出,但这是标准Java库的一部分。否则,您将如何读取XML?如果您愿意使用DOM解析器,我可以推荐一些例子。因为DOM不能处理巨大的XML文件,所以我将使用SAX/StAX
<docs>
    <doc>
        <id>102</id>
        <stock>10</stock>
    </doc>
</docs>
Doc{id='102', name='Samsung', brand='S3', Stock='null'}
Doc{id='102', name='null', brand='null', Stock='10'}
Doc{id='102', name='Samsung', brand='S3', Stock='10'}
String xml2 = "<docs><doc><id>102</id><name>Samsung</name><brand>S3</brand></doc></docs>";
InputStream in = new ByteArrayInputStream(xml1.getBytes("utf-8"));