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