Xpath语法:https://www.runoob.com/xpath/xpath-syntax.html
Xpath表达式语法参考:xpath表达式使用
Document对象
1.读取XML文件,获得document对象
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File("*.xml"));
2.主动创建document对象.
Document document = DocumentHelper.createDocument();
Element rootElement = document.addElement("root");
节点对象
1.获取文档的根节点.
Element rootElement = document.getRootElement();
2.取得某个节点的子节点.(element继承于node,具有Node的方法,同时又拓展了很多自己的特有方法)
@return the first element with the given local name
Element element=node.element(“节点名");
//@return the <code>Node</code> matching the XPath expression
Node node = node.selectSingleNode("xpath表达式");
3.取得节点的文字
String text=node.getText();
4.在某节点下添加子节点.
Element ageElm = newMemberElm.addElement("age");
ageElm .setText("29");
6.遍历子节点
方式一:
List<Element> list = rootElement.selectNodes("//Q1");
for(Element e : list){
String text = e.getText();
System.out.println(text);
}
方式二:
Element element1 = (Element) root.selectSingleNode("//QsInfos");
if( null != element1) {
Iterator<Element> ipInfoIterator = element1.elementIterator();
while (ipInfoIterator.hasNext()) {
Element e= ipInfoIterator.next();
//相关处理
}
上述几种基本方法,使用element或node均可。
将文档写入XML文件.
1.文档中全为英文,不设置编码,直接写入的形式.
File file = new File("D://output.xml");//不需要提前创建出该文件
XMLWriter writer = new XMLWriter(new FileWriter(file);
writer.write(document);
writer.close();
2.文档中含有中文,设置编码格式写入的形式.
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
// 设置换行
format.setNewlines(true);
// 生成缩进
format.setIndent(true);
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"),format);
writer.write(document);
writer.close();
工具类(自动解析XMl文件并封装到实体类中):
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.lang.reflect.Method;
import java.util.*;
public class XmlUtil {
/*!解析xml文件,并将结果封装到bean类
* taskFile 需要解析的xml文件,
* array【】 , array2【】 需要解析的节点名称,
* pac1 ,dat Javabean类,用来保存解析得到的节点属性,分别为package类和data类,
*category 节点名称,其子节点一般包含多个data数据
*/
public static Map<String, Object> analysisXml(File taskFile, String[] array, String[] array2, Class pac1, Class dat, String category) throws Exception {
HashMap<String, Object> map = new HashMap<>();
List<Object> list = new LinkedList<>();
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(taskFile);
Element rootElement = document.getRootElement();
//xml数据封装到package中
try {
Object obj = pac1.newInstance();
for (int i = 0; i < array.length; i++) {
String str = "set" + array[i].substring(0, 1).toUpperCase() + array[i].substring(1);
Node packageNode = rootElement.selectSingleNode("//" + array[i]);
//判断节点是否存在,若存在反射调用set方法
if (null != packageNode && packageNode.hasContent()) {
String text = packageNode.getText();
Method method = pac1.getMethod(str, String.class);
method.invoke(obj, text);
} else {
System.out.println(packageNode.getName() + ",节点不存在");
}
}
map.put("pac", obj);
} catch (Exception e) {
e.printStackTrace();
}
//将xml数据封装到卫星数据data中
List<Node> productNodeList = rootElement.selectNodes("//" + category);
if (productNodeList != null && !productNodeList.isEmpty()) {
for (Node productNode : productNodeList) {
//容器只保存对象的句柄,故每次调用set方法都需先反射出一个新对象
Object o = dat.newInstance();
for (int i = 0; i < array2.length; i++) {
Node dataNode = productNode.selectSingleNode(".//" + array2[i]);
if (null != dataNode && dataNode.hasContent()) {
String str = null;
if(taskFile.getName().contains("Check") && !taskFile.getName().contains("Check2")){
str = "set" + array2[i].substring(0, 1).toUpperCase() + array2[i].substring(1) + "1";
}else if(taskFile.getName().contains("Check2")){
str = "set" + array2[i].substring(0, 1).toUpperCase() + array2[i].substring(1) + "2";
}else{
str = "set" + array2[i].substring(0, 1).toUpperCase() + array2[i].substring(1);
}
String text = dataNode.getText();
Method method = dat.getMethod(str, String.class);
method.invoke(o, text);
}
}
list.add(o);
}
} else {
list = new LinkedList<>();
System.out.println("卫星数据列表为空"+ taskFile.getAbsolutePath());
}
map.put("data", list);
return map;
}
}
测试类
@RequestMapping("t1")
public void test1() {
File file = new File("F:\\Geoway\\cs\\GF701_BWD_003057_E117.2_N39.0_20200522110847_01_SC0_0001_2005201314.xml");
String[] array = {"ProductLevel", "SatelliteID"};
String[] array2 = {"FileType", "FileFormat","Filename"};
String category = "file";
Map<String, Object> map = null;
try {
map = XmlUtil.analysisXml(file, array, array2, Pac.class, Employee.class,category);
} catch (Exception e) {
e.printStackTrace();
}
Pac pac1 = (Pac) map.get("pac");
paService.save(pac1);
LinkedList<Employee> list = (LinkedList)map.get("data");
for(Employee employee : list){
employeeService.save(employee);
}
/*Iterator<Employee> iterator = list.iterator();
while(iterator.hasNext()){
Employee emp = iterator.next();
employeeService.save(emp);
}*/
System.out.println(pac1);
System.out.println(list);
}
Xml文件
<sensor_corrected_metadata>
<productComponents>
<file>
<FileType>metadata</FileType>
<Location>.</Location>
<Filename>GF701_BWD_003057_E117.2_N39.0_20200522110847_01_SC0_0001_2005201314.xml</Filename>
<FileFormat>Xml</FileFormat>
<FormatVer>1.0</FormatVer>
</file>
<file>
<FileType>imageData</FileType>
<Location>.</Location>
<Filename>GF701_BWD_003057_E117.2_N39.0_20200522110847_01_SC0_0001_2005201314.tif</Filename>
<FileFormat>Tif</FileFormat>
<FormatVer>1.0</FormatVer>
</file>
<file>
<FileType>rpcFile</FileType>
<Location>.</Location>
<Filename>GF701_BWD_003057_E117.2_N39.0_20200522110847_01_SC0_0001_2005201314_rpc.txt</Filename>
<FileFormat>Txt</FileFormat>
<FormatVer>1.0</FormatVer>
</file>
<file>
<FileType>browseImage</FileType>
<Location>.</Location>
<Filename>GF701_BWD_003057_E117.2_N39.0_20200522110847_01_SC0_0001_2005201314_pre.jpg</Filename>
<FileFormat>Jpg</FileFormat>
<FormatVer>1.0</FormatVer>
</file>
<file>
<FileType>thumbImage</FileType>
<Location>.</Location>
<Filename>GF701_BWD_003057_E117.2_N39.0_20200522110847_01_SC0_0001_2005201314_ico.jpg</Filename>
<FileFormat>Jpg</FileFormat>
<FormatVer>1.0</FormatVer>
</file>
<file>
<FileType>RadioModelFile</FileType>
<Location>.</Location>
<Filename>GF701_BWD_003057_E117.2_N39.0_20200522110847_01_SC0_0001_2005201314_rad.xml</Filename>
<FileFormat>Xml</FileFormat>
<FormatVer>1.0</FormatVer>
</file>
<file>
<FileType>geoRangeFile</FileType>
<Location>./GeoRange</Location>
<Filename>GF701_BWD_003057_E117.2_N39.0_20200522110847_01_SC0_0001_2005201314.shp</Filename>
<FileFormat>Shp</FileFormat>
<FormatVer>1.0</FormatVer>
</file>
</productComponents>
<productInfo>
<ProductLevel>SC</ProductLevel>
<SatelliteID>GF701</SatelliteID>
<ReceiveStationID>MYC</ReceiveStationID>
<SensorID>BWD</SensorID>
<DefaultTimeType>BJ</DefaultTimeType>
<AcquisitionTime>2020-05-22 11:08:47</AcquisitionTime>
<OrbitID>003057</OrbitID>
<SceneID>107446</SceneID>
<SceneMode>N</SceneMode>
<SceneLong>E117.2</SceneLong>
<SceneLat>N39.0</SceneLat>
<ScenePath>1784</ScenePath>
<SceneRow>254</SceneRow>
<SceneCount>1</SceneCount>
<OrbitType>GPS</OrbitType>
<AttitudeType>STAR</AttitudeType>
<SunAltitude>67.070351</SunAltitude>
<SunAzimuth>139.785652</SunAzimuth>
<SatAzimuth>126.177287</SatAzimuth>
<SatAltitude>77.442193</SatAltitude>
<SwingSatelliteAngle>-0.091855</SwingSatelliteAngle>
<RollViewingAngle>-10.536284</RollViewingAngle>
<PitchViewingAngle>0.539955</PitchViewingAngle>
<TimeStamp>
<TimeType>BJ</TimeType>
<StartTime>2020-05-22 11:08:45.43540704</StartTime>
<EndTime>2020-05-22 11:08:49.14724803</EndTime>
<CenterTime>2020-05-22 11:08:47.29132754</CenterTime>
<Interval>0.000092798344638754</Interval>
</TimeStamp>
<WidthInPixels>35864</WidthInPixels>
<HeightInPixels>40000</HeightInPixels>
<ImageGSD>
<Line>0.661391280654847424</Line>
<Sample>0.673081024199823075</Sample>
</ImageGSD>
<WidthInMeters>24139.377851902456313837</WidthInMeters>
<HeightInMeters>26455.651226193895126926</HeightInMeters>
<RegionName>empty</RegionName>
<CloudPercent>0.1</CloudPercent>
<ProductQuality>1</ProductQuality>
<PixelByte>ui16</PixelByte>
<PixelInvalidVal>0</PixelInvalidVal>
<Bands>1</Bands>
<FUSMethod>PAN</FUSMethod>
<PanMinSpectralValue>0.000000</PanMinSpectralValue>
<PanMaxSpectralValue>2047.000000</PanMaxSpectralValue>
<BlueMinSpectralValue>empty</BlueMinSpectralValue>
<BlueMaxSpectralValue>empty</BlueMaxSpectralValue>
<GreenMinSpectralValue>empty</GreenMinSpectralValue>
<GreenMaxSpectralValue>empty</GreenMaxSpectralValue>
<RedMinSpectralValue>empty</RedMinSpectralValue>
<RedMaxSpectralValue>empty</RedMaxSpectralValue>
<NearInfraredMinSpectralValue>empty</NearInfraredMinSpectralValue>
<NearInfraredMaxSpectralValue>empty</NearInfraredMaxSpectralValue>
<ProductGeographicRange>
<CenterPoint>
<Sample>17932</Sample>
<Line>20000</Line>
<Longtitude>117.236219</Longtitude>
<Latitude>39.001980</Latitude>
<Altitude>-4.883988</Altitude>
</CenterPoint>
<LeftTopPoint>
<Sample>0</Sample>
<Line>0</Line>
<Longtitude>117.130348</Longtitude>
<Latitude>39.142459</Latitude>
<Altitude>-4.883996</Altitude>
</LeftTopPoint>
<RightTopPoint>
<Sample>35863</Sample>
<Line>0</Line>
<Longtitude>117.402874</Longtitude>
<Latitude>39.094323</Latitude>
<Altitude>-4.883993</Altitude>
</RightTopPoint>
<RightBottomPoint>
<Sample>35863</Sample>
<Line>39999</Line>
<Longtitude>117.340318</Longtitude>
<Latitude>38.861610</Latitude>
<Altitude>-4.883980</Altitude>
</RightBottomPoint>
<LeftBottomPoint>
<Sample>0</Sample>
<Line>39999</Line>
<Longtitude>117.068701</Longtitude>
<Latitude>38.909680</Latitude>
<Altitude>-4.883983</Altitude>
</LeftBottomPoint>
</ProductGeographicRange>
</productInfo>
<processInfo>
<ProductTime>2020-06-18 19:04:02</ProductTime>
<ProduceID>1911115402</ProduceID>
<DataSource>RC</DataSource>
<ProduceType>STANDARD</ProduceType>
<CalibrationInfo>
<Geometric>~~~~~~~~~~~~20200601;20200601;</Geometric>
<Radiometric>~~~~~~~~~GF7-01CalibrationFile</Radiometric>
</CalibrationInfo>
<RadiometricMethod>REL</RadiometricMethod>
<PanAbsRadioCalibrationCoeff>empty</PanAbsRadioCalibrationCoeff>
<NearInfraredAbsRadioCalibrationCoeff>empty</NearInfraredAbsRadioCalibrationCoeff>
<RedAbsRadioCalibrationCoeff>empty</RedAbsRadioCalibrationCoeff>
<GreenAbsRadioCalibrationCoeff>empty</GreenAbsRadioCalibrationCoeff>
<BlueAbsRadioCalibrationCoeff>empty</BlueAbsRadioCalibrationCoeff>
<MtfCompensation>No</MtfCompensation>
<Denoise>Yes</Denoise>
<RayleighCorrection>No</RayleighCorrection>
<GeometryMethod>SEC</GeometryMethod>
<HeightMode>AVE-Height</HeightMode>
<DEMAverage>-4.886066</DEMAverage>
<DEMPrecision>empty</DEMPrecision>
<ResamplingKernel>Rasied_Cosine_6P</ResamplingKernel>
<ResampleNum>1</ResampleNum>
</processInfo>
<distributionInfo>
<ProductPrice>empty</ProductPrice>
<Productmedia>empty</Productmedia>
<Productformat>empty</Productformat>
<DistributorPhone>empty</DistributorPhone>
<DistributorFaxPhone>empty</DistributorFaxPhone>
<DistributorAdministratityArea>empty</DistributorAdministratityArea>
<DistributorAddress>empty</DistributorAddress>
<DistributorPostCode>empty</DistributorPostCode>
<DistributorName>empty</DistributorName>
<DistributorEMail>empty</DistributorEMail>
<DistributorURL>empty</DistributorURL>
</distributionInfo>
</sensor_corrected_metadata>