JAVA Xpath 表达式为 return 找不到属性时为 null
JAVA Xpath expression to return null when attribute not found
在下面的xml示例中
<employee>
<payment contractType="1">
<income type="0">
<gr amount="2063.00" kae="211" code="1" />
<gr amount="400.00" kae="215" code="6" />
<et amount="47.55" kae="292" code="4012501" />
<et amount="105.21" kae="293" code="4052000" />
<de amount="88.15" code="4003101" />
</income>
</payment>
</employee>
<employee>
<payment contractType="1">
<income type="0">
<gr amount="70.00" kae="213" code="4" />
<gr amount="1560.00" kae="211" code="1" />
</income>
</payment>
</employee>
我需要为 "code" = "4" 获取 "amount" 的值。如果收入节点不包含此类数据(gr with code = "4"),我需要 return 类似 null 或 boolean false 的东西。目的是查看 xml 文件中的所有员工,如果他们没有代码 4 的金额,则将他们加载到带有 0 的 Arraylist 中,否则加载金额值。
我在这部分使用的代码:
public class ReadXMLfile {
public static void main(String[] args) {
try {
FileInputStream file = new FileInputStream(new File("E2015_1_1.xml"));
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFactory.newDocumentBuilder();
Document xmlDocument = builder.parse(file);
XPath xPath = XPathFactory.newInstance().newXPath();
expression = "/psp/body/organizations/organization/employees/employee/payment/income[@type='0']/gr";
nodeList = (NodeList) xPath.compile(expression).evaluate(xmlDocument, XPathConstants.NODESET);
ArrayList<String> gr4incomeList = new ArrayList<String>();
for (int i = 0; i < nodeList.getLength(); i++) {
String acode = (String)nodeList.item(i).getAttributes().getNamedItem("code").getNodeValue();
System.out.println("acode = '" + acode + "'");
if (acode.equals("4")){
System.out.println(nodeList.item(i).getAttributes().getNamedItem("amount").getNodeValue());
gr4incomeList.add(nodeList.item(i).getAttributes().getNamedItem("amount").getNodeValue());
System.out.println("array = " + gr4incomeList.get(i));
}else
gr4incomeList.add("0000");
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (XPathExpressionException e) {
e.printStackTrace();
}
}
}
问题是它在数组列表中为找到的任何 gr 写入“0000”,但代码为“4”的除外。
我真的卡住了
有什么想法吗?谢谢大家!
XPathExpression exp = xpath.compile("/employees/employee");
NodeList nodeList = (NodeList)exp.evaluate(xmlDocument, XPathConstants.NODESET);
XPathExpression grexp = xpath.compile("payment/income/gr[@code='4']");
XPathExpression amexp = xpath.compile("payment/income/gr[@code='4']/@amount");
for( int i = 0; i < nodeList.getLength(); ++i ){
Node item = nodeList.item( i );
Object resexp1 = grexp.evaluate( item, XPathConstants.NODE );
if( resexp1 != null ){
String resexp2 = amexp.evaluate( item );
System.out.println( resexp2 );
} else {
System.out.println( "0000" );
}
}
为 XML 片段生成如下所示:
0000
70.00
在下面的xml示例中
<employee>
<payment contractType="1">
<income type="0">
<gr amount="2063.00" kae="211" code="1" />
<gr amount="400.00" kae="215" code="6" />
<et amount="47.55" kae="292" code="4012501" />
<et amount="105.21" kae="293" code="4052000" />
<de amount="88.15" code="4003101" />
</income>
</payment>
</employee>
<employee>
<payment contractType="1">
<income type="0">
<gr amount="70.00" kae="213" code="4" />
<gr amount="1560.00" kae="211" code="1" />
</income>
</payment>
</employee>
我需要为 "code" = "4" 获取 "amount" 的值。如果收入节点不包含此类数据(gr with code = "4"),我需要 return 类似 null 或 boolean false 的东西。目的是查看 xml 文件中的所有员工,如果他们没有代码 4 的金额,则将他们加载到带有 0 的 Arraylist 中,否则加载金额值。
我在这部分使用的代码:
public class ReadXMLfile {
public static void main(String[] args) {
try {
FileInputStream file = new FileInputStream(new File("E2015_1_1.xml"));
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFactory.newDocumentBuilder();
Document xmlDocument = builder.parse(file);
XPath xPath = XPathFactory.newInstance().newXPath();
expression = "/psp/body/organizations/organization/employees/employee/payment/income[@type='0']/gr";
nodeList = (NodeList) xPath.compile(expression).evaluate(xmlDocument, XPathConstants.NODESET);
ArrayList<String> gr4incomeList = new ArrayList<String>();
for (int i = 0; i < nodeList.getLength(); i++) {
String acode = (String)nodeList.item(i).getAttributes().getNamedItem("code").getNodeValue();
System.out.println("acode = '" + acode + "'");
if (acode.equals("4")){
System.out.println(nodeList.item(i).getAttributes().getNamedItem("amount").getNodeValue());
gr4incomeList.add(nodeList.item(i).getAttributes().getNamedItem("amount").getNodeValue());
System.out.println("array = " + gr4incomeList.get(i));
}else
gr4incomeList.add("0000");
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (XPathExpressionException e) {
e.printStackTrace();
}
}
}
问题是它在数组列表中为找到的任何 gr 写入“0000”,但代码为“4”的除外。
我真的卡住了
有什么想法吗?谢谢大家!
XPathExpression exp = xpath.compile("/employees/employee");
NodeList nodeList = (NodeList)exp.evaluate(xmlDocument, XPathConstants.NODESET);
XPathExpression grexp = xpath.compile("payment/income/gr[@code='4']");
XPathExpression amexp = xpath.compile("payment/income/gr[@code='4']/@amount");
for( int i = 0; i < nodeList.getLength(); ++i ){
Node item = nodeList.item( i );
Object resexp1 = grexp.evaluate( item, XPathConstants.NODE );
if( resexp1 != null ){
String resexp2 = amexp.evaluate( item );
System.out.println( resexp2 );
} else {
System.out.println( "0000" );
}
}
为 XML 片段生成如下所示:
0000
70.00