使用Java比较和合并XML文件中的两个字符串
我有两个xml文件,它们存储为字符串。我想比较每个xml文件中的特定字符串,如果这些字符串匹配,我需要将它们合并为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
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"));