我需要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实现这一点。
答案 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();