XPath表达式在Java中的评估方式与XML Spy中的不同?

时间:2014-07-12 17:23:04

标签: java xml xpath

这些XPath表达式在Java中的评估与在XML Spy中的表达式不同。为了了解我的意思,您需要运行Java代码,查看控制台的输出并将每个xPath表达式粘贴到XML Spy,以查看答案的不同之处。谁能告诉我为什么以及如何应对呢?

import java.util.HashSet;
import java.util.Set;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class Main
{
    public static void main(String[] argv) throws Exception
    {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(false);
        DocumentBuilder builder;

        builder = factory.newDocumentBuilder();
        //wherever you happen to stick the xml file
        Document doc = builder.parse("C:\\SVN\\Claims_Extract_Bridge\\src\\config\\Templates.xml");

        XPathFactory xpf = XPathFactory.newInstance();
        XPath xPath = xpf.newXPath();

        //This one works where it only has to find one node
        XPathExpression xpath1 = xPath.compile("//Template[Rules/Rule/TreatmentSetting='IO'  and Rules/Rule/DiagnosisCodes/DiagnosisRange[substring(concat(translate(DiagnosisStart, '.', '0'), '0000000000'), 1, 6)<='291005'  and substring(concat(translate(DiagnosisEnd, '.', '0'), '0000000000'), 1, 6)>='291005' ] and Rules/Rule/ProcedureCodes/ProcedureRange[ProcedureStart<='0906'  and ProcedureEnd>='0906' ]]");

        NodeList diagnosisRangeList = (NodeList)xpath1.evaluate(doc, XPathConstants.NODESET);
        System.out.println("Should return 1 Template node from XML file and it does, see what I mean:  " + diagnosisRangeList.getLength() + " node(s)");

        //This one should return 1 nodes (it does in XML Spy) but returns 0?
        xpath1 = xPath.compile("//Template[Rules/Rule/TreatmentSetting='PO'  and Rules/Rule/DiagnosisCodes/DiagnosisRange[substring(concat(translate(DiagnosisStart, '.', '0'), '0000000000'), 1, 6)<='242000'  and substring(concat(translate(DiagnosisEnd, '.', '0'), '0000000000'), 1, 6)>='242000' ] and Rules/Rule/ProcedureCodes/ProcedureRange[ProcedureStart<='59841'  and ProcedureEnd>='59841' ]]");
        diagnosisRangeList = (NodeList)xpath1.evaluate(doc, XPathConstants.NODESET);
        System.out.println("Should return 1 node from XML file but instead returns 0, see what I mean:  " + diagnosisRangeList.getLength() + " nodes");

        //This one returns 2 nodes in XML SPY but 0 nodes in Java? 
        xpath1 = xPath.compile("//Template[Rules/Rule/DiagnosisCodes/DiagnosisRange[substring(concat(translate(DiagnosisStart, '.', '0'), '0000000000'), 1, 6)<='62602'  and substring(concat(translate(DiagnosisEnd, '.', '0'), '0000000000'), 1, 6)>='62602' ] and Rules/Rule/ProcedureCodes/ProcedureRange[ProcedureStart<='55250'  and ProcedureEnd>='55250' ]]");
        diagnosisRangeList = (NodeList)xpath1.evaluate(doc, XPathConstants.NODESET);
        System.out.println("Should return 2 nodes from XML file but instead returns 0, see what I mean:  " + diagnosisRangeList.getLength() + " nodes");

    }
}

以下是正在阅读的XML文件:

<?xml version="1.0" encoding="UTF-8" ?>
<Templates>
    <Template>
        <TemplateCode>GLOB</TemplateCode>
        <Units>9999</Units>
        <Rules>
            <Rule>
                <TreatmentSetting>PO</TreatmentSetting>
                <DiagnosisCodes>
                    <DiagnosisRange>
                        <DiagnosisStart>0</DiagnosisStart>
                        <DiagnosisEnd>ZZZZZZ</DiagnosisEnd>
                    </DiagnosisRange>
                </DiagnosisCodes>
                <ProcedureCodes>
                    <ProcedureRange>
                        <ProcedureStart>99213</ProcedureStart>
                        <ProcedureEnd>99213</ProcedureEnd>
                    </ProcedureRange>
                </ProcedureCodes>
            </Rule>
        </Rules>
    </Template>
    <Template>
        <TemplateCode>ME004</TemplateCode>
        <Units>1:1</Units>
        <Rules>
            <Rule>
                <TreatmentSetting>H</TreatmentSetting>
                <DiagnosisCodes>
                    <DiagnosisRange>
                        <DiagnosisStart>0</DiagnosisStart>
                        <DiagnosisEnd>ZZZZZZ</DiagnosisEnd>
                    </DiagnosisRange>
                </DiagnosisCodes>
                <ProcedureCodes>
                    <ProcedureRange>
                        <ProcedureStart>99341</ProcedureStart>
                        <ProcedureEnd>99345</ProcedureEnd>
                    </ProcedureRange>
                </ProcedureCodes>
            </Rule>
        </Rules>
    </Template>
    <Template>
        <TemplateCode>ME004</TemplateCode>
        <Units>1:3</Units>
        <Rules>
            <Rule>
                <TreatmentSetting>PO</TreatmentSetting>
                <DiagnosisCodes>
                    <DiagnosisRange>
                        <DiagnosisStart>0</DiagnosisStart>
                        <DiagnosisEnd>ZZZZZZ</DiagnosisEnd>
                    </DiagnosisRange>
                </DiagnosisCodes>
                <ProcedureCodes>
                    <ProcedureRange>
                        <ProcedureStart>92511</ProcedureStart>
                        <ProcedureEnd>92608</ProcedureEnd>
                    </ProcedureRange>
                    <ProcedureRange>
                        <ProcedureStart>92611</ProcedureStart>
                        <ProcedureEnd>96999</ProcedureEnd>
                    </ProcedureRange>
                </ProcedureCodes>
            </Rule>
        </Rules>
    </Template>
    <Template>
        <TemplateCode>ME011</TemplateCode>
        <Units>1:1</Units>
        <Rules>
            <Rule>
                <TreatmentSetting>IO</TreatmentSetting>
                <DiagnosisCodes>
                    <DiagnosisRange>
                        <DiagnosisStart>290.00</DiagnosisStart>
                        <DiagnosisEnd>290.99</DiagnosisEnd>
                    </DiagnosisRange>
                </DiagnosisCodes>
                <ProcedureCodes>
                    <ProcedureRange>
                        <ProcedureStart>0905</ProcedureStart>
                        <ProcedureEnd>0905</ProcedureEnd>
                    </ProcedureRange>
                    <ProcedureRange>
                        <ProcedureStart>0912</ProcedureStart>
                        <ProcedureEnd>0912</ProcedureEnd>
                    </ProcedureRange>
                </ProcedureCodes>
            </Rule>
            <Rule>
                <TreatmentSetting>IO</TreatmentSetting>
                <DiagnosisCodes>
                    <DiagnosisRange>
                        <DiagnosisStart>303.00</DiagnosisStart>
                        <DiagnosisEnd>305.99</DiagnosisEnd>
                    </DiagnosisRange>
                </DiagnosisCodes>
                <ProcedureCodes>
                    <ProcedureRange>
                        <ProcedureStart>0906</ProcedureStart>
                        <ProcedureEnd>0906</ProcedureEnd>
                    </ProcedureRange>
                    <ProcedureRange>
                        <ProcedureStart>0912</ProcedureStart>
                        <ProcedureEnd>0913</ProcedureEnd>
                    </ProcedureRange>
                </ProcedureCodes>
            </Rule>
        </Rules>
    </Template>
</Templates>

0 个答案:

没有答案