将嵌套XML映射到Java变量
我有以下XML示例:将嵌套XML映射到Java变量,java,xml,dom,Java,Xml,Dom,我有以下XML示例: <DiagnosticResult> <RESULTSHEADER> <VEHICLE> <IDENT> <REGISTRATION>car registration</REGISTRATION> <MANUFACTURER>car manuf</MANUFACTURER>
<DiagnosticResult>
<RESULTSHEADER>
<VEHICLE>
<IDENT>
<REGISTRATION>car registration</REGISTRATION>
<MANUFACTURER>car manuf</MANUFACTURER>
<MODEL>car model</MODEL>
</IDENT>
<DATA>
<VEHICLE_IMAGE>veh url</VEHICLE_IMAGE>
</DATA>
</VEHICLE>
</RESULTSHEADER>
<RESULT OBJECT="WHEEL_ALIGNMENT" METHOD="MANUFACTURER_SPECIFIC">
<SECTION OBJECT="TIRE_INSPECTION" AXLE="1">
<TITLE>Tire Inspection Axle 1</TITLE>
<MEAS OBJECT="TREAD_DEPTH_DISPLAY_1" LOC="LEFT">
<TITLE>Tread Depth Point</TITLE>
<VALUE UNIT="mm" RESULT="0">4.491</VALUE>
<VALUE TYPE="DISP" UNIT="finch" LOWLIM1="2/32" LOWLIM2="4/32" RESULT="1">6/32</VALUE>
</MEAS>
<MEAS OBJECT="TREAD_DEPTH_DISPLAY_2" LOC="LEFT">
<TITLE>Tread Depth Point</TITLE>
<VALUE UNIT="mm" RESULT="0">5.871</VALUE>
<VALUE TYPE="DISP" UNIT="finch" LOWLIM1="2/32" LOWLIM2="4/32" RESULT="1">7/32</VALUE>
</MEAS>
<MEAS OBJECT="TREAD_DEPTH_DISPLAY_3" LOC="LEFT">
<TITLE>Tread Depth Point</TITLE>
<VALUE UNIT="mm" RESULT="0">6.277</VALUE>
<VALUE TYPE="DISP" UNIT="finch" LOWLIM1="2/32" LOWLIM2="4/32" RESULT="1">8/32</VALUE>
</MEAS>
<MEAS OBJECT="TREAD_DEPTH_DISPLAY_1" LOC="RIGHT">
<TITLE>Tread Depth Point</TITLE>
<VALUE UNIT="mm" RESULT="0">5.694</VALUE>
<VALUE TYPE="DISP" UNIT="finch" LOWLIM1="2/32" LOWLIM2="4/32" RESULT="1">7/32</VALUE>
</MEAS>
<MEAS OBJECT="TREAD_DEPTH_DISPLAY_2" LOC="RIGHT">
<TITLE>Tread Depth Point</TITLE>
<VALUE UNIT="mm" RESULT="0">4.821</VALUE>
<VALUE TYPE="DISP" UNIT="finch" LOWLIM1="2/32" LOWLIM2="4/32" RESULT="1">6/32</VALUE>
</MEAS>
<MEAS OBJECT="TREAD_DEPTH_DISPLAY_3" LOC="RIGHT">
<TITLE>Tread Depth Point</TITLE>
<VALUE UNIT="mm" RESULT="0">4.560</VALUE>
<VALUE TYPE="DISP" UNIT="finch" LOWLIM1="2/32" LOWLIM2="4/32" RESULT="1">6/32</VALUE>
</MEAS>
<MEAS OBJECT="TREAD_DEPTH_DISPLAY_4" LOC="RIGHT">
<TITLE>Tread Depth Point</TITLE>
<VALUE UNIT="mm" RESULT="0">5.158</VALUE>
<VALUE TYPE="DISP" UNIT="finch" LOWLIM1="2/32" LOWLIM2="4/32" RESULT="1">6/32</VALUE>
</MEAS>
</SECTION>
<SECTION OBJECT="TIRE_INSPECTION" AXLE="2">
<MEAS OBJECT="TREAD_DEPTH_DISPLAY_1" LOC="LEFT">
<TITLE>Tread Depth Point</TITLE>
<VALUE UNIT="mm" RESULT="0">5.199</VALUE>
<VALUE TYPE="DISP" UNIT="finch" LOWLIM1="2/32" LOWLIM2="4/32" RESULT="1">7/32</VALUE>
</MEAS>
<MEAS OBJECT="TREAD_DEPTH_DISPLAY_2" LOC="LEFT">
<TITLE>Tread Depth Point</TITLE>
<VALUE UNIT="mm" RESULT="0">6.052</VALUE>
<VALUE TYPE="DISP" UNIT="finch" LOWLIM1="2/32" LOWLIM2="4/32" RESULT="1">8/32</VALUE>
</MEAS>
<MEAS OBJECT="TREAD_DEPTH_DISPLAY_3" LOC="LEFT">
<TITLE>Tread Depth Point</TITLE>
<VALUE UNIT="mm" RESULT="0">6.275</VALUE>
<VALUE TYPE="DISP" UNIT="finch" LOWLIM1="2/32" LOWLIM2="4/32" RESULT="1">8/32</VALUE>
</MEAS>
<MEAS OBJECT="TREAD_DEPTH_DISPLAY_1" LOC="RIGHT">
<TITLE>Tread Depth Point</TITLE>
<VALUE UNIT="mm" RESULT="0">5.270</VALUE>
<VALUE TYPE="DISP" UNIT="finch" LOWLIM1="2/32" LOWLIM2="4/32" RESULT="1">7/32</VALUE>
</MEAS>
<MEAS OBJECT="TREAD_DEPTH_DISPLAY_2" LOC="RIGHT">
<TITLE>Tread Depth Point</TITLE>
<VALUE UNIT="mm" RESULT="0">5.249</VALUE>
<VALUE TYPE="DISP" UNIT="finch" LOWLIM1="2/32" LOWLIM2="4/32" RESULT="1">7/32</VALUE>
</MEAS>
<MEAS OBJECT="TREAD_DEPTH_DISPLAY_3" LOC="RIGHT">
<TITLE>Tread Depth Point</TITLE>
<VALUE UNIT="mm" RESULT="0">5.685</VALUE>
<VALUE TYPE="DISP" UNIT="finch" LOWLIM1="2/32" LOWLIM2="4/32" RESULT="1">7/32</VALUE>
</MEAS>
</SECTION>
<SUMMARY>
<TITLE>Quick Check Results</TITLE>
<MEAS OBJECT="TIRE_CHECK">
<TITLE>Tread Depth</TITLE>
<VALUE RESULT="1">PASSED</VALUE>
</MEAS>
</SUMMARY>
</RESULT>
</DiagnosticResult>
我遇到的问题是如何访问具有相同名称的字段。举一个例子:
<MEAS OBJECT="TREAD_DEPTH_DISPLAY_1" LOC="LEFT">
<TITLE>Tread Depth Point</TITLE>
<VALUE UNIT="mm" RESULT="0">4.491</VALUE>
<VALUE TYPE="DISP" UNIT="finch" LOWLIM1="2/32" LOWLIM2="4/32" RESULT="1">6/32</VALUE>
</MEAS>
这负责查找元素,但会覆盖变量。
输出应为:
1/32
2/32
3/32
4/32
5/32
6/32
7/32
8/32
但现在是:
5/32
6/32
7/32
8/32
5/32
6/32
7/32
8/32
尝试以下解决方案
public static void main(String[] args) {
try {
File inputFile = new File("Input.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document document = dBuilder.parse(inputFile);
document.getDocumentElement().normalize();
NodeList nodeList = document.getElementsByTagName("MEAS");
for (int i = 0; i < nodeList.getLength(); i++) {
Element element = (Element) nodeList.item(i);
Node node = nodeList.item(i);
if(element.getAttribute("OBJECT").equals("TREAD_DEPTH_DISPLAY_1")){
NodeList childNodeList = element.getElementsByTagName("VALUE");
for (int j = 0; j < childNodeList.getLength(); j++) {
Element childElement = (Element) childNodeList.item(j);
if(j==0){
System.out.println("First Value Element");
System.out.println("UNIT : "+childElement.getAttribute("UNIT")+
", RESULT : "+childElement.getAttribute("RESULT")+
", VALUE : "+childElement.getTextContent());
}else{
System.out.println("Second Value Element");
System.out.println("TYPE : "+childElement.getAttribute("TYPE")+
" UNIT : "+childElement.getAttribute("UNIT")+
" LOWLIM1 : "+childElement.getAttribute("LOWLIM1")+
" LOWLIM2 : "+childElement.getAttribute("LOWLIM2")+
", RESULT : "+childElement.getAttribute("RESULT")+
", VALUE : "+childElement.getTextContent());
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
谢谢你的详细回答。我用过它,它很管用。我有一个快速跟进的问题。我编辑了我的原始问题。如果它对您有效,请接受答案:)。谢谢
5/32
6/32
7/32
8/32
5/32
6/32
7/32
8/32
public static void main(String[] args) {
try {
File inputFile = new File("Input.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document document = dBuilder.parse(inputFile);
document.getDocumentElement().normalize();
NodeList nodeList = document.getElementsByTagName("MEAS");
for (int i = 0; i < nodeList.getLength(); i++) {
Element element = (Element) nodeList.item(i);
Node node = nodeList.item(i);
if(element.getAttribute("OBJECT").equals("TREAD_DEPTH_DISPLAY_1")){
NodeList childNodeList = element.getElementsByTagName("VALUE");
for (int j = 0; j < childNodeList.getLength(); j++) {
Element childElement = (Element) childNodeList.item(j);
if(j==0){
System.out.println("First Value Element");
System.out.println("UNIT : "+childElement.getAttribute("UNIT")+
", RESULT : "+childElement.getAttribute("RESULT")+
", VALUE : "+childElement.getTextContent());
}else{
System.out.println("Second Value Element");
System.out.println("TYPE : "+childElement.getAttribute("TYPE")+
" UNIT : "+childElement.getAttribute("UNIT")+
" LOWLIM1 : "+childElement.getAttribute("LOWLIM1")+
" LOWLIM2 : "+childElement.getAttribute("LOWLIM2")+
", RESULT : "+childElement.getAttribute("RESULT")+
", VALUE : "+childElement.getTextContent());
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
First Value Element
UNIT : mm, RESULT : 0, VALUE : 4.491
Second Value Element
TYPE : DISP UNIT : finch LOWLIM1 : 2/32 LOWLIM2 : 4/32, RESULT : 1, VALUE : 6/32
First Value Element
UNIT : mm, RESULT : 0, VALUE : 5.694
Second Value Element
TYPE : DISP UNIT : finch LOWLIM1 : 2/32 LOWLIM2 : 4/32, RESULT : 1, VALUE : 7/32
First Value Element
UNIT : mm, RESULT : 0, VALUE : 5.199
Second Value Element
TYPE : DISP UNIT : finch LOWLIM1 : 2/32 LOWLIM2 : 4/32, RESULT : 1, VALUE : 7/32
First Value Element
UNIT : mm, RESULT : 0, VALUE : 5.270
Second Value Element
TYPE : DISP UNIT : finch LOWLIM1 : 2/32 LOWLIM2 : 4/32, RESULT : 1, VALUE : 7/32