1

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

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

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

编码 :

            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();
        }
    }                   
    }
4

1 回答 1

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

我认为你以某种方式设法跳过了爸爸的元素。尝试简化你的逻辑。所有这些要求nextTag业务对我来说似乎都是错误的。另外,虽然我不确定,但你的条件语句while似乎很愚蠢。如果完成,请改用xmlStreamReader.hasNext并跳出循环。

于 2012-10-14T09:48:50.203 回答