如何使用java获取SAME XML标签byStaX的值?

时间:2015-09-23 05:40:01

标签: java xml parsing stax

我正在尝试从xml文档中检索值。   XML大小高达3GB。所以我选择使用java的StaX解析器。   在这里,我使用下面的代码来检索标签之间的值。   如果我执行代码,那么我从一个标签获得值。   我想要三个Tag值。

<Author>
  <Number>1</SequenceNumber>
  <Role>B01</ContributorRole>
  <Name>Klaus Misgeld</PersonName>
  <NameInverted>Misgeld, Klaus</PersonNameInverted>
  <BeforeKey>Klaus</NamesBeforeKey>
  <KeyNames>Misgeld</KeyNames>
 </Author>
 <Author>
  <Number>2</SequenceNumber>
  <Role>B01</ContributorRole>
  <Name>Karl Molin</PersonName>
  <NameInverted>Molin, Karl</PersonNameInverted>
  <BeforeKey>Karl</NamesBeforeKey>
  <KeyNames>Molin</KeyNames>
 </Author>
 <Author>
  <Number>3</SequenceNumber>
  <Role>B01</ContributorRole>
  <Name>Klas Amark</PersonName>
  <NameInverted>Amark, Klas</PersonNameInverted>
  <BeforeKey>Klas</NamesBeforeKey>
  <KeyNames>Amark</KeyNames>
 </Author>

  Same XML Tag...

如何从同一个xml标记中检索值?

我试过了   XMLReader.java

 XMLEventReader xmlEventReader = xmlInputFactory.createXMLEventReader(new FileInputStream(fileName));
        while(xmlEventReader.hasNext()){
            XMLEvent xmlEvent = xmlEventReader.nextEvent();
           if (xmlEvent.isStartElement()){
               StartElement startElement = xmlEvent.asStartElement();
               if(startElement.getName().getLocalPart().equals("Product")){
                   emp = new BookSpecBean();

               }
               //set the other varibles from xml elements

                     if(startElement.getName().getLocalPart().equals("Author")){
               else if(startElement.getName().getLocalPart().equals("Number")){
                   xmlEvent = xmlEventReader.nextEvent();
                   emp.setSequencenumberchar(xmlEvent.asCharacters().getData());
               }else if(startElement.getName().getLocalPart().equals("Role")){
                   xmlEvent = xmlEventReader.nextEvent();
                   emp.setContributorrolechar(xmlEvent.asCharacters().getData());
               }else if(startElement.getName().getLocalPart().equals("Name")){
                   xmlEvent = xmlEventReader.nextEvent();
                   emp.setPersonnamechar(xmlEvent.asCharacters().getData());
               }else if(startElement.getName().getLocalPart().equals("NameInverted")){
                   xmlEvent = xmlEventReader.nextEvent();
                   emp.setPersonnameinvertedchar(xmlEvent.asCharacters().getData());
               }else if(startElement.getName().getLocalPart().equals("BeforeKey")){
                   xmlEvent = xmlEventReader.nextEvent();
                   emp.setNamebeforekeychar(xmlEvent.asCharacters().getData());
               }else if(startElement.getName().getLocalPart().equals("KeyNames")){
                   xmlEvent = xmlEventReader.nextEvent();
                   emp.setKeynameschar(xmlEvent.asCharacters().getData());

它检索单个值。   如何检索所有三个标签值。   我正在使用StaX解析器。   谢谢你的回答..

1 个答案:

答案 0 :(得分:0)

你的问题不明确。您的XML不是well-formed(例如<Number>...</SequenceNumber>)。目前尚不清楚“三个标签值”是什么意思。我认为你想得到所有3位作者。

我不知道您的代码是如何组织的。我认为以下内容可行。

您的班级BookSpecBean必须包含Author个对象的列表。然后,您可以在XML中添加尽可能多的Author

class BookSpecBean {
  private final List<Author> authors;

  public BookSpecBean() {
    authors = new ArrayList<Author>();
  }

  public void addAuthor(Author a) {
    authors.add(a);
  }

  public List<Author> getAllAuthors() {
    return authors;
  }

  // ... and more fields ...
}

class Author {
  public String getRole() { ... }
  public void setRole(String role) { ... }

  public int getNumber() { ... }
  public void setNumber(int n) { ... }

  // ... and more fields ...
}

class BookSpecXmlReader {
  public BookSpecBean readBookSpec(XMLEventReader reader) {
    BookSpecBean book = new BookSpecBean();
    while (reader.hasNext()) {
      XMLEvent event = reader.nextEvent();
      if (event.isStartElement()) {
        StartElement startEl = event.asStartElement();
        String elementName = startEl.getName().getLocalPart();
        if (elementName.equals("Author")) {
          book.addAuthor(readAuthor(reader));
        }
      } else if (event.isEndElement()) {
        EndElement endEl = event.asEndElement();
        if (endEl.getName().getLocalPart().equals("Product")) {
          return book;
        }
      }
    }
  }

  private Author readAuthor(XMLEventReader reader) {
    Author author = new Author();
    while (reader.hasNext()) {
      XMLEvent event = reader.nextEvent();
      if (event.isStartElement()) {
        StartElement startEl = event.asStartElement();
        String elementName = startEl.getName().getLocalPart();
        if (startEl.equals("Role")) {
          author.setRole(reader.nextEvent().asCharacters().getData());
        } else if (startEl.equals("Number")) {
          author.setNumber(Integer.parseInt(
              reader.nextEvent().asCharacters().getData()));
        }
      } else if (event.isEndElement()) {
        EndElement endEl = event.asEndElement();
        if (endEl.getName().getLocalPart().equals("Author")) {
          return author;
        }
      }
    }
  }
}