如何读取包含多个元素的XML文件

时间:2014-11-26 11:59:34

标签: java xml

我有一个我写的XML文件,如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Library name="StreetCorner">
    <Book name="HarryPotter">
        <Author name="JKRowling"/>
    </Book>
    <Book name="SherlockHolmes">
        <Author name="SirAConandoyle"/>
    </Book>
    <Book name="AngelsAndDemons">
        <Author name="DanBrown"/>
    </Book>
</Library>

阅读本文的最简单方法是什么?

我需要获取图书馆名称,该图书馆中的所有图书以及撰写该图书的作者姓名。

我已经有一个名为Library的模型,所以如果我可以用每个解析器提取数据,我可以将值设置为Library对象。

name是我xml中每个元素的属性。

4 个答案:

答案 0 :(得分:1)

在Java中从XML文件中获取信息的一种方法是使用Java XML DOM解析器。

您从:

开始
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(file);

然后访问加载的数据:

Element root = document.getDocumentElement();
root.getElementsByTagName("Book")

您可以找到完整的教程here。这种方法最大的缺点是你将整个文档加载到内存中,但在你的情况下它不是问题。

其他内置选项包括:

  • SAX解析器
  • JAXP

您可以在this document中找到这些选项的详细说明。讨论了更多选项in this question

答案 1 :(得分:1)

您可以尝试使用映射库。 Simple XML将自动解析您的XML并放置在Java对象中。您只需要使用注释标记对象。

答案 2 :(得分:1)

这是使用JAXB

读取xml的简单方法

测试跑步者班级

public class XmlTest
{
  public static void main(String[] args)
  {
    try
    {
      File file = new File("d:\\file.xml");
      JAXBContext jaxbContext = JAXBContext.newInstance(Library.class);

      Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
      Library library = (Library) jaxbUnmarshaller.unmarshal(file);

      for (Book book : library.getBookList())
      {
        System.out.println(book.getName());
      }
    }
    catch (JAXBException e)
    {
      e.printStackTrace();
    }

  }
}

预订课程

@XmlType
@XmlAccessorType(XmlAccessType.FIELD)
public class Book
{
  @XmlAttribute(name = "name")
  private String name;

  public String getName()
  {
    return name;
  }

  public void setName(String name)
  {
    this.name = name;
  }
}

图书馆班级

@XmlRootElement(name = "Library")
@XmlAccessorType(XmlAccessType.FIELD)
public class Library
{
  @XmlAttribute(name = "name")
  private String name;

  @XmlElement(name = "Book")
  private List<Book> bookList;

  public List<Book> getBookList()
  {
    return bookList;
  }

  public void setBookList(List<Book> bookList)
  {
    this.bookList = bookList;
  }

  public String getName()
  {
    return name;
  }

  public void setName(String name)
  {
    this.name = name;
  }
}

Xml编剧

public class XMlWriter
{
  public static void main(String[] args)
  {
    ArrayList<Book> bookArrayList = new ArrayList<Book>();
    Book myNewBook = new Book();
    myNewBook.setName("My First Copy");
    bookArrayList.add(myNewBook);

    Library library = new Library();
    library.setName("My Name");
    library.setBookList(bookArrayList);

    try
    {
      JAXBContext jaxbContext = JAXBContext.newInstance(Library.class);
      Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
      jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
      try
      {
        jaxbMarshaller.marshal(library, new FileOutputStream("D:\\file2.xml"));
      }
      catch (FileNotFoundException e)
      {
        e.printStackTrace();
      }
      jaxbMarshaller.marshal(library, System.out);
    }
    catch (JAXBException e)
    {
      e.printStackTrace();
    }
  }
}

使用以下参考资料

<强> reading xml document using jaxb

<强> http://www.mkyong.com/java/jaxb-hello-world-example/

*请注意,这不是进行异常处理的方法

答案 3 :(得分:0)

我建议使用Xpath。 Xpath可用于获取所有元素,例如在你的情况下,你可以获得所有书籍,或者你可以获得第一本书并循环阅读。

以下是Tutorialspoint.com的一个很好的教程: http://www.w3schools.com/xpath/xpath_examples.asp