【问题标题】:how to get the value of SAME XML tag byStaX using java?如何使用java获取StaX的SAME XML标签的值?
【发布时间】:2015-12-20 07:27:20
【问题描述】:

我正在尝试从 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 解析器。 谢谢你的回答。。

【问题讨论】:

    标签: java xml parsing stax


    【解决方案1】:

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

    我不知道您的代码是如何组织的。我认为类似以下的方法会起作用。

    你的类BookSpecBean 必须有一个Author 对象列表。然后,您可以在 XML 中添加尽可能多的 Authors。

    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;
            }
          }
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多