簡體   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