Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JAXB:解组和修改混合内容_Java_Xml_Xsd_Jaxb - Fatal编程技术网

Java JAXB:解组和修改混合内容

Java JAXB:解组和修改混合内容,java,xml,xsd,jaxb,Java,Xml,Xsd,Jaxb,我已经开始从JAXB库学习Java。我的目标是解组和修改JATSXML,它有很多混合内容。实际上,如果简化,XML如下所示: <article> <body> <sec> <title>text</title> <list></list> <sec><p></p></sec> <p>

我已经开始从JAXB库学习Java。我的目标是解组和修改JATSXML,它有很多混合内容。实际上,如果简化,XML如下所示:

<article>
  <body>
    <sec>
      <title>text</title>
      <list></list>
      <sec><p></p></sec>
      <p>
        text
        <junk>text</junk>
        <morejunk>text</morejunk>
      </p>
      <anotherjunkcontent>text</anotherjunkcontent>
    </sec>
  </body>
</article>
我的部分代码是,对xml进行解组和整理:

public class transformMain {

    public static void main(String[] args) throws JAXBException {
        JAXBContext jaxbContext = JAXBContext.newInstance(ObjectFactory.class);
        Unmarshaller unmarhsaller = jaxbContext.createUnmarshaller();
        Article article = (Article) unmarhsaller.unmarshal(new File("article.xml"));

        Body elementBody = article.getBody();
        List<Sec> listSec = elementBody.getSec();

        for (Sec eSec : listSec) {
            List<Object> listObjectsInSec = eSec.getContent();
            for (Object insideList : listObjectsInSec) {
            //ToDO something here to get content, modify it and put it back
            //System.out.println(insideList);
            }

        }
        Marshaller marshaller = jaxbContext.createMarshaller();
        marshaller.marshal(article, new File("article2.xml"));
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
    }
}
public类transformMain{
公共静态void main(字符串[]args)抛出JAXBEException{
JAXBContext JAXBContext=JAXBContext.newInstance(ObjectFactory.class);
Unmarshaller unmarhsaller=jaxbContext.createUnmarshaller();
Article=(Article)unmarhsaller.unmarshal(新文件(“Article.xml”);
Body elementBody=article.getBody();
List listSec=elementBody.getSec();
对于(秒eSec:listSec){
List listObjectsInSec=eSec.getContent();
for(对象内部列表:listObjectsInSec){
//在此处执行某些操作以获取内容、修改内容并将其放回
//System.out.println(内部列表);
}
}
Marshaller=jaxbContext.createMarshaller();
marshaller.marshall(文章,新文件(“article2.xml”);
setProperty(marshaller.JAXB_格式化的_输出,true);
}
}

我怎么办?行
System.out.println(内部列表)给我一个对象列表,比如
…对象。Title@4f6f416f
…对象。P@3b8f0a79
。如何从中检索数据?toString()或String.valueOf()在这种情况下不起作用,可能是因为它们没有可以表示为字符串的值。我在编程方面没有经验,所以这可能是显而易见的?

JAXB在您希望将对象序列化为XML然后再序列化回来(例如webservices)时非常有用。XML太宽,JAXB无法方便地管理。我并不是说这是不可能的,但最终你可能会遇到一些难以使用、几乎无法更新的东西。当文档允许混合内容或任何内容时,您应该依赖DOM、SAX或Stax。对我来说,使用对象比使用节点元素更好。希望我能用JAXB找到好的解决方案。您可以使用
instanceOf
找到它可以转换到的对象。然后将其强制转换到该
对象
,以检索值。
public class transformMain {

    public static void main(String[] args) throws JAXBException {
        JAXBContext jaxbContext = JAXBContext.newInstance(ObjectFactory.class);
        Unmarshaller unmarhsaller = jaxbContext.createUnmarshaller();
        Article article = (Article) unmarhsaller.unmarshal(new File("article.xml"));

        Body elementBody = article.getBody();
        List<Sec> listSec = elementBody.getSec();

        for (Sec eSec : listSec) {
            List<Object> listObjectsInSec = eSec.getContent();
            for (Object insideList : listObjectsInSec) {
            //ToDO something here to get content, modify it and put it back
            //System.out.println(insideList);
            }

        }
        Marshaller marshaller = jaxbContext.createMarshaller();
        marshaller.marshal(article, new File("article2.xml"));
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
    }
}