【问题标题】:How to compare to XML Files and point out the differences?如何与 XML 文件进行比较并指出差异?
【发布时间】:2013-12-02 18:29:54
【问题描述】:

我必须使用 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 two 中有 4 本书类别:BookCat1 BookCat3 BookCat4 BookCat5

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

然后对于子元素,我必须为 XML2 中的每个元素指出添加或删除了哪些子元素。例如,对于 XML2 来说,添加了 BOOKCAT1 标记。

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

【问题讨论】:

    标签: java xml xml-parsing


    【解决方案1】:

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

    【讨论】:

    • 是的,但是如何比较子元素,我的意思是迭代每个子元素不会很麻烦。有更好的方法吗?
    【解决方案2】:

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

    为此有一些库。例如 diffxmlhttp://diffxml.sourceforge.net/

    您也可以自己实现它。查看 wikipedia 上的这篇文章以了解 Graph Isomorphismhttp://en.wikipedia.org/wiki/Graph_isomorphism_problem

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

    也可以看看这个关于 SO 的问答:Detect differences between tree structures

    如果这是您的面试问题,他们可能有兴趣了解您将如何对问题进行分类以及如何解决问题(减少、抽象、极端案例、工作量估计、重用已知解决方案、权衡取舍、. ..)。

    【讨论】:

      【解决方案3】:

      您可以为此使用 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();
      

      【讨论】:

        猜你喜欢
        • 2015-08-10
        • 1970-01-01
        • 2011-11-19
        • 1970-01-01
        • 1970-01-01
        • 2021-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多