簡體   English   中英

在Java中使用xPath獲取節點

[英]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/descriptionvalue ,所以需要兩個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM