如何比较两个XML文件并指出差异?

时间:2013-11-19 09:21:28

标签: java xml xml-parsing

我需要XML文件,比如格式

<bookstore>
  <book category="COOKING">
    <title lang="en">Everyday Italian</title>
    <author>Giada De Laurentiis</author>
    <year>2005</year>
    <price>30.00</price>
  </book>
  <book category="CHILDREN">
    <title lang="en">Harry Potter</title>
    <author>J K. Rowling</author>
    <year>2005</year>
    <price>29.99</price>
  </book>
  <book category="WEB">
    <title lang="en">Learning XML</title>
    <author>Erik T. Ray</author>
    <year>2003</year>
    <price>39.95</price>
  </book>
</bookstore>

假设我在 XML one 中有3个图书类别:BookCat1 BookCat2 BookCat3 &安培;我在 XML二中有4个图书分类:BookCat1 BookCat3 BookCat4 BookCat5

我必须首先指出,哪些类别已添加或删除? 例如:这里BookCat2被删除,而BookCat4&amp;增加了5个。

然后,对于子元素,我必须为XML2中的每个元素指出添加或删除子元素 .eg对于XML2来说,添加BOOKCAT1标签。

实现这一目标的最佳方法是什么?我必须使用Java实现这一点。

3 个答案:

答案 0 :(得分:0)

这是你的面试问题吗? 您可以使用XPATH //book/@category来生成类别列表。 在两个XML上运行XPath可以比较结果。

答案 1 :(得分:0)

要解决的问题是将树与另一棵树进行比较,这与比较两个目录结构(及其属性)相同。

有图书馆。例如 diffxml http://diffxml.sourceforge.net/

您也可以自己实施。在维基百科上查看图形同构的这篇文章:http://en.wikipedia.org/wiki/Graph_isomorphism_problem

当然这意味着递归遍历对象图等。

另请参阅SO上的问答:Detect differences between tree structures

如果这是你的面试问题,他们可能会对你如何对问题进行分类以及如何解决问题感兴趣(减少,抽象,角落案例,努力评估,重用已知解决方案,权衡取舍,等等。 ..)。

答案 2 :(得分:0)

您可以使用JAXB。创建两个类Book和BookStore。

您需要在java类中加载(解组)两个文件xml文件。然后使用循环,你可以找到添加或删除的。

定义Book.class

@XmlRootElement(name = "book")
public class Book {
String title;

String author;

String year;

String price;

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getAuthor() {
    return author;
}

public void setAuthor(String author) {
    this.author = author;
}

public String getYear() {
    return year;
}

public void setYear(String year) {
    this.year = year;
}

public String getPrice() {
    return price;
}

public void setPrice(String price) {
    this.price = price;
}

}

并像这样定义BookStore.class -

@XmlRootElement
public class BookStore {

List<Book> books;

@XmlElement(name = "book")
public List<Book> getBooks() {
    return books;
}

public void setBooks(List<Book> books) {
    this.books = books;
}

}

您可以像这样加载xml文件

 Unmarshaller um = context.createUnmarshaller();
 Bookstore bookstore2 = (BookStore) um.unmarshal(new FileReader("yourxml.xml"));
List<Book> list = bookstore2.getBooksList();