[英]Get nodes with xPath in Java
僅當description為T1時,並且從xPath列表中獲取作業描述的每個值(Mecánica,Guarnecidos等)時,我才需要獲取值28.42。
<priceByHourList>
<priceByHour locked="false">
<value>
<job>
<jobId>4</jobId>
<description>
<id>4</id>
<value>Mecánica</value>
</description>
</job>
<technician>
<technicianId>1</technicianId>
<description>T1</description>
</technician>
<value>28.42</value>
</value>
</priceByHour>
<priceByHour locked="false">
<value>
<job>
<jobId>4</jobId>
<description>
<id>4</id>
<value>Mecánica</value>
</description>
</job>
<technician>
<technicianId>2</technicianId>
<description>T2</description>
</technician>
<value>28.42</value>
</value>
</priceByHour>
<priceByHour locked="false">
<value>
<job>
<jobId>4</jobId>
<description>
<id>4</id>
<value>Mecánica</value>
</description>
</job>
<technician>
<technicianId>3</technicianId>
<description>T3</description>
</technician>
<value>28.42</value>
</value>
</priceByHour>
<priceByHour locked="false">
<value>
<job>
<jobId>1</jobId>
<description>
<id>1</id>
<value>Electricidad</value>
</description>
</job>
<technician>
<technicianId>2</technicianId>
<description>T2</description>
</technician>
<value>28.42</value>
</value>
</priceByHour>
<priceByHour locked="false">
<value>
<job>
<jobId>1</jobId>
<description>
<id>1</id>
<value>Electricidad</value>
</description>
</job>
<technician>
<technicianId>3</technicianId>
<description>T3</description>
</technician>
<value>28.42</value>
</value>
</priceByHour>
<priceByHour locked="false">
<value>
<job>
<jobId>5</jobId>
<description>
<id>5</id>
<value>Guarnecidos</value>
</description>
</job>
<technician>
<technicianId>1</technicianId>
<description>T1</description>
</technician>
<value>28.42</value>
</value>
</priceByHour>
我正在嘗試獲取列表,但是節點是相同的。
for (int i = 0; i < nodes.getLength(); i++) {
Element pieza = (Element) nodes.item(i);
System.out.println(pieza.getNodeName());}
因為您需要兩個詳細信息: job/description
和value
,所以需要兩個xpath表達式。 您可以執行以下操作:
public class PriceByHour
{
private static class PriceDetails
{
String jobDesc;
String value;
}
public static void main( String... args )
{
try
{
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse( new File( ".//pricebyhour.xml" ) );
XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xpath = xPathFactory.newXPath();
List<PriceDetails> priceDetailsList = new ArrayList<PriceDetails>();
XPathExpression jobExpr = xpath.compile( "//priceByHour/value[technician[./description='T1']]/job/description/value" );
XPathExpression valueExpr = xpath.compile( "//priceByHour/value[technician[./description='T1']]/value" );
Object exprEval = jobExpr.evaluate( doc, XPathConstants.NODESET );
NodeList jobNodes = null;
NodeList valueNodes = null;
if ( exprEval != null && exprEval instanceof NodeList )
{
jobNodes = (NodeList)exprEval;
}
exprEval = valueExpr.evaluate( doc, XPathConstants.NODESET );
if ( exprEval != null && exprEval instanceof NodeList )
{
valueNodes = (NodeList)exprEval;
}
if ( jobNodes != null && valueNodes != null && jobNodes.getLength() == valueNodes.getLength() )
{
for ( int i = 0 ; i < jobNodes.getLength(); i++ )
{
Node jobNode = jobNodes.item( i );
Node valueNode = valueNodes.item( i );
PriceDetails priceDetails = new PriceDetails();
priceDetails.jobDesc = jobNode.getTextContent();
priceDetails.value = valueNode.getTextContent();
priceDetailsList.add( priceDetails );
}
}
for ( PriceDetails priceDetails : priceDetailsList )
{
System.out.println( "Job description is : " + priceDetails.jobDesc + ", " + "Value is : " + priceDetails.value );
}
}
catch ( Exception e )
{
e.printStackTrace();
}
}
}
將您的xml放在一個名為pricebyhour.xml
的文件中,然后運行此代碼。
注意,第一個xpath獲取作業描述,第二個xpath獲取值。 職位描述和值的數量應該匹配,並且您實際上可以構建一個包含兩個值的職位描述和值的類,如類PriceDetails
所示。
輸出為:
Job description is : Mecánica, Value is : 28.42
Job description is : Guarnecidos, Value is : 28.42
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.