繁体   English   中英

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

[英]Comparing and merging two strings in an XML file using Java

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

file1.xml:

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

</docs>

file2.xml :

<docs>
  <doc>
    <id>102</id>
    <stock>10</stock>
  </doc> 
</docs>

我想使用Java比较2个XML文件中的ID(即102),如果匹配,则希望在单个XML文件中进行以下输出

output.xml:

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

请为此提供确切的代码,因为我是这个主题的新手。 如果可能,请尝试不使用循环语句就给我答案

您可以尝试根据您的需要运行的示例。 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();
    }

}

Doc是将包含文档对象的类。

class Doc {
    String id;
    String name;
    String brand;
    String stock;

    @Override
    public String toString() {
        return "Doc{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", brand='" + brand + '\'' +
                ", Stock='" + stock + '\'' +
                '}';
    }
}

主要类是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文件对其进行了测试: abc.xml

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

def.xml

<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'}

如果您要尝试此操作而没有循环,则可以尝试创建地图并插入/更新结果。 如果您想了解基础知识,那么是一个很好的参考。

如果您想将XML保持为String形式,则可以将InputStream为:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM