在JAVA中读取XML

时间:2016-08-22 07:52:54

标签: java xml

我想在JAVA中阅读我的XML

   <?xml version="1.0" encoding="UTF-8"?>
<myapp version="1.0">
<photo_information>
  <date>2016/08/20</date>
  <time>17:21:59</time>
  <user_data></user_data>
  <prints>1</prints>
  <photos>
    <photo image="1">IMG_0001.JPG</photo>
    <photo image="2">IMG_0002.JPG</photo>
    <photo image="3">IMG_0003.JPG</photo>
    <photo image="4">IMG_0004.JPG</photo>
    <output>prints\160820_172159.jpg</output>
  </photos>
</photo_information>
</myapp>

我需要以下信息:

  • 打印

  • 所有图片(IMG_0001.JPG,IMG_0002.JPG,IMG_0003.JPG,IMG_0004.JPG)

  • 输出(prints \ 160820_172159.jpg)

我尝试使用此代码,但它不起作用:

 package my.app.test;

import java.io.File;
import java.io.IOException;
import java.util.List;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;

public class TestXML {

    public static void main(String[] args) {

        Document doc = null;

        String filePath = "/myPath/IMG_0001.xml";
        File f = new File(filePath);

        try {

            SAXBuilder builder = new SAXBuilder();
            doc = builder.build(f);
            XMLOutputter fmt = new XMLOutputter();


            fmt.output(doc, System.out);


            Element element = doc.getRootElement();
            System.out.println("\nWurzelelement: " + element);


            System.out.println("Wurzelelementname: " + element.getName());


            List alleKinder = (List) element.getChildren();
            System.out.println("Erstes Kindelement: "
                    + ((Element) alleKinder.get(0)).getName());


            List benannteKinder = element.getChildren("photos");


            System.out.println("benanntes Kindelement: "
                    + ((Element) benannteKinder.get(0)).getName());


            Element kind = element.getChild("bw_mode");
            System.out.println("Photo: " + kind.getValue());


            Element kind2 = element.getChild("photo");
            System.out.println("Photo: " + kind2.getAttributeValue("name"));
        } catch (JDOMException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

3 个答案:

答案 0 :(得分:1)

最好的方法是创建一个模式并使用JAXB将传入的XML解组为java对象并像POJO一样读取它。

如果您不知道如何创建架构,那么您可以使用一些在线工具获取帮助 - http://xmlgrid.net/xml2xsd.html

然后,您必须使用ANT生成Java对象。

是的!为这样一个简单的问题做了很多工作,但这就是如何用Java解析xmls。

答案 1 :(得分:0)

除了您的方法,您还可以查看库xstream xstream

该库使您可以将对象序列化和反序列化为xml代码。

您的第一步是为包含照片信息所有字段的类建模。通常你会称之为PhotoInformation:

class PhotoInformation {
   LocalDate date;
   LocalTime time;
   UserData userData;
   int prints;
   Photos photos;
}

此外,您还需要创建一些其他类:UserData和Photos。

在下一步中,您需要设置xstream的解析器,以使用xml文件中的内容填充对象。 为此,如果您喜欢注释,可以找到教程herehere

答案 2 :(得分:0)

使用JAXB解析将是一个更好的选择。要对此进行解析,您必须创建类。

///将其添加到插件的pom中

    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxb2-maven-plugin</artifactId>
    <version>1.6</version>

开设以下课程

        @XmlRootElement(name = "myapp")
        class MyApp{
        PhotoInformation[] photoInformation;

        @XmlElement(name = "photo_information")
        public PhotoInformation getPhotoInformation() {
            return individuals;
        }

        public void setPhotoInformation(Individuals photoInformation) {
            this.individuals = individuals;
        }
    }
@XmlRootElement(name= "photo_Information")
class PhotoInformation {
   LocalDate date;
   LocalTime time;
   UserData userData;
   int prints;
   Photos[] photos;
//add getters and setters for the above variables with the @XmlElement Annotations and correct tag name
}

@XmlRootElement(name= "photo")
class Photo{
String photo;
//add getter and setter for the above variables with the @XmlElement Annotations and correct tag name
}

用于解组(解析)文件

    JAXBContext jaxbContext = JAXBContext.newInstance(MyApp.class);
    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
    File XMLfile = new File(folderPath);
    myApp myapp = (myApp) jaxbUnmarshaller.unmarshal(XMLfile);

通过myapp对象,您将能够访问myApp类内的其余标签,并且可以进一步迭代photo_information并访问照片。

我希望这对您有帮助