这些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>