繁体   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