无法使用XMLReader访问特定的XML元素

时间:2012-10-13 19:44:27

标签: java xml parsing jaxb

我需要使用xmlreader解析以下xml文件,然后使用JAXB解组部件。

<parents>
    <moms>
      <mom>
       ...
      </mom>
       <mom>
       ...
      </mom>
   ...
    </moms>
    <dads>
      <dad>
       ..
      </dad>
      ..
      ..
    </dads>
</parents>

我可以访问<moms>元素,但我无法使用相同的Xmlreader变量或全新的<dads>元素。我只能找到妈妈元素,然后进入那里的层次结构......

代码:

            fileInputStream = new FileInputStream( file );
        xmlStreamReader = Utils.getXMLStreamReader( fileInputStream, "UTF-8" );
        JAXBContext context = JAXBContext.newInstance(Moms.class, Dads.class);
        unmarshaller = context.createUnmarshaller();
        xmlStreamReader.nextTag();

            xmlStreamReader.require( XMLStreamConstants.START_ELEMENT, null, "parents" ); 
            xmlStreamReader.nextTag();
            xmlStreamReader.nextTag();
            xmlStreamReader.require( XMLStreamConstants.START_ELEMENT, null, part );
            xmlStreamReader.require( XMLStreamConstants.START_ELEMENT, null, "parents" ); 
           while ( xmlStreamReader.getEventType() == XMLStreamConstants.START_ELEMENT )
    {
        String localName = xmlStreamReader.getLocalName();

        if ( localName.equals("dads") )
        {
            xmlStreamReader.nextTag();
        }


        if (xmlStreamReader.getEventType() ==XMLStreamConstants.CHARACTERS) 
        {
            xmlStreamReader.next();
        }
    }                   
    }

1 个答案:

答案 0 :(得分:3)

给出以下XML

<parents>
  <moms>
    <mom>A</mom>
    <mom>B</mom>
  </moms>
  <dads>
    <dad>C</dad>
  </dads>
</parents>

以下代码

InputStream is = new FileInputStream("...");
XMLInputFactory xif = XMLInputFactory.newFactory();
XMLStreamReader xsr = xif.createXMLStreamReader(is);
while (xsr.hasNext()) {
  if (xsr.next() == XMLStreamConstants.START_ELEMENT
      && xsr.getLocalName().equals("dad")) {

    if (xsr.next() == XMLStreamConstants.CHARACTERS)
      System.out.println(xsr.getText());
  }
}

打印 C

我认为你设法跳过了 dad 元素。尝试简化您的逻辑。所有需要 nextTag 业务对我来说都是错误的。此外,虽然我不确定,但中的条件语句似乎很愚蠢。改为使用 xmlStreamReader.hasNext ,如果你已经完成,就跳出循环。