我想在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();
}
}
}
答案 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文件中的内容填充对象。 为此,如果您喜欢注释,可以找到教程here或here。
答案 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并访问照片。
我希望这对您有帮助