[英]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.