2011-12-20 49 views
1

代碼:XPATH +解析在Java +需要獲得一個屬性的XML檢查訪問下一個兄弟值

package com.parse; 

import org.w3c.dom.*; 

import javax.xml.xpath.*; 
import javax.xml.parsers.*; 
import java.io.IOException; 
import org.xml.sax.SAXException; 

public class XpathDemoOld { 

    public static void main(String[] args) 
throws ParserConfigurationException, SAXException, 
    IOException, XPathExpressionException { 

    DocumentBuilderFactory domFactory = 
    DocumentBuilderFactory.newInstance(); 
    domFactory.setNamespaceAware(true); 
    DocumentBuilder builder = domFactory.newDocumentBuilder(); 
    Document doc = builder.parse("xml.xml"); 
    XPath xpath = XPathFactory.newInstance().newXPath(); 
    // XPath Query for showing all nodes value 
    XPathExpression expr = xpath.compile("/QDTM_IN300301QD/controlActEvent/subject/subject/testCodeIdentifier/coveredPartyOf/financialTransactionEvent/subjectOf/annotation/code[@code='CPTCODE']/following-sibling::text/text()"); 

    Object result = expr.evaluate(doc, XPathConstants.NODESET); 
    NodeList nodes = (NodeList) result; 
    System.out.println("Length --- " + nodes.getLength()); 
    for (int i = 0; i < nodes.getLength(); i++) { 

     System.out.println("Node Value--->" + nodes.item(i).getNodeValue()); 

    } 
} 
} 

XML:

<?xml version="1.0" encoding="UTF-8"?> 
<QDTM_IN300301QD ITSVersion="XML_1.0" xmlns="urn:hl7-org:v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:hl7-org:v3 QDTM_IN300301QD.xsd "> 
    <id assigningAuthorityName="TEST" extension="6399Z"/> 
    <creationTime value="20111111121213" /> 
    <responseModeCode code="I"/> 
    <versionCode code="V3-2010-12-Q2"/> 
    <interactionId extension="QDTM_IN300301QD"/> 
    <profileId extension="TBD"/> 
    <processingCode code="P"/> 
    <processingModeCode code="T"/> 
    <acceptAckCode code="NE"/> 
    <receiver typeCode="RCV"> 
    <realmCode code="QD" /> 
    <device classCode="DEV" determinerCode="INSTANCE" > 
     <realmCode code="QD" /> 
     <id assigningAuthorityName="RECEIVERID" extension="TESTCENTER" /> <!-- These are identifiers for the recieving application and would be picked from the request message --> 
    </device> 
    </receiver> 
    <sender typeCode="SND"> 
    <realmCode code="QD" /> 
    <device classCode="DEV" determinerCode="INSTANCE" > 
     <realmCode code="QD" /> 
     <id assigningAuthorityName="SENDERID" extension="QTIM" /> <!-- These are identifiers for the sending application and can be picked from the recieving section of the request message --> 
    </device> 
    </sender> 
    <controlActEvent classCode="CACT" moodCode="EVN"> 
    <id assigningAuthorityName="TESTMESSAGEID" extension="6399Z" /> 
    <code code="TBD"> 
    </code> 
    <statusCode code="Active"/> 
    <subject contextConductionInd="true"> 
     <registrationEvent classCode="REG" moodCode="EVN"> 
     <realmCode code="QD" /> 
     <statusCode code="Active"/> 
     <subject contextControlCode="AN" typeCode="SBJ"> 
     <realmCode code="QD" /> 
     <testCodeIdentifier classCode="ROL"> 
     <id assigningAuthorityName="PRMKEY" extension="SJC6399Z"/> <!-- This is a unique key in case of JDOS information. Might not be needed in case of FD. If it is decided that this is not required for FD then this can be removed --> 
     <playingTestCodeDetails classCode="ENT" determinerCode="INSTANCE"> 
      <realmCode code="QD" /> 
      <id assigningAuthorityName="PRMORDCODE" extension="6399Z" /><!--This is the primary order code for the test. Would be NTC in case of a Master--> 
      <code code="6399Z" codeSystemName="QTIM" > 
      <originalText><![CDATA[Complete Blood Count]]></originalText> 
      <originalText><![CDATA[Blood Cells]]></originalText> 
      </code> 
      <statusCode code="Active"/> 
      <testCodeHasMember classCode="MBR" negationInd="true" > 
      <subjectOf typeCode="SBJ"> 
      <annotation classCode="ACT" moodCode="EVN" > 
      <realmCode code="QD" /> 
      <code code="INCLUDESHTMLENABLED"></code> 
      <text><![CDATA[WBC, RBC, Hemoglobin, Hematocrit, MCV, MCH, MCHC, RDW, Platelet Count, MPV and Differential (Absolute and Percent - Neutrophils, Lymphocytes, Monocytes, Eosinophils, and Basophils) <br /> 
       If abnormal cells are noted on a manual review of the peripheral blood smear or if the automated differential information meets specific criteria, a full manual differential will be performed.]]></text> <!-- Includes information is being passed here --> 
      <statusCode code="Updated"/><!-- This flag would indicate if this field has been updated or not --> 
      </annotation> 
     </subjectOf>    
      </testCodeHasMember> 
     </playingTestCodeDetails> 
     <subjectOf typeCode="SBJ"> 
      <realmCode code="QD" /> 
      <order classCode="OBS" moodCode="EVN"> 
     <realmCode code="QD" /> 
     <performer typeCode="PRF"> 
      <locatedEntity classCode="LOCE"> 
      <locatedOrganization classCode="ORG" determinerCode="INSTANCE"> 
      </locatedOrganization> 
      <subjectOf typeCode="SBJ"> 
       <annotation classCode="ACT" moodCode="EVN"> 
      <text><![CDATA[Quest Diagnostics Nichols Institute <br /> 33608 Ortega Highway <br /> San Juan Capistrano, CA 92690-6130]]></text> <!-- Performing lab address information would be passed here --> 
      <statusCode code="Update"/><!-- This is the update flag for the performing lab address field--> 
       </annotation> 
      </subjectOf> 
      </locatedEntity> 
     </performer> 
       <pertinentInformation2 typeCode="PERT"> 
      <observationEvent classCode="OBS" moodCode="EVN"> 
      <referenceRange nullFlavor="" typeCode="REFV"> 
       <interpretationRange classCode="OBS" moodCode="EVN"> 
      <subjectOf typeCode="SUBJ"> 
       <annotation classCode="ACT" moodCode="EVN"> 
       <code code="REFERENCERANGE"> <!-- Reference Range Information -->  
       </code> 
       <text><![CDATA[IgA SUBCLASSES __IgA1 (UOM mg/dL) 6-11 months: 1-115 mg/dL 1 year: 3-120 mg/dL 2 years: 7-132 mg/dL 3 years: 11-143 mg/dL 4-7 years: 23-175 mg/dL 8-11 years: 33-204 mg/dL 12-17 years: 47-249 mg/dL >=18 years: 46-378 mg/dL IgA SUBCLASSES __IgA2 (UOM mg/dL) 6-11 months: 0-19 mg/dL 1 year: 0-23 mg/dL 2 years: 1-23 mg/dL 3 years: 1-25 mg/dL 4-7 years: 2-33 mg/dL 8-11 years: 2-37 mg/dL 12-17 years: 4-50 mg/dL >=18 years: 13-91 mg/dL IgA SUBCLASSES __IgA, Serum (UOM mg/dL) 6-11 months: 3-101 mg/dL 1 year: 6-112 mg/dL 2 years: 11-134 mg/dL 3 years: 16-155 mg/dL 4-7 years: 31-214 mg/dL 8-11 years: 43-268 mg/dL 12-17 years: 65-356 mg/dL >=18 years: 81-463 mg/dL]]></text> 
       <statusCode code="token"/> 
       </annotation> 
      </subjectOf> 
       </interpretationRange> 
      </referenceRange> 
      </observationEvent> 
       </pertinentInformation2> 
       <pertinentInformation3 typeCode="PERT"> 
      <scheduleEvent classCode="ACT" moodCode="EVN" > 
      <subjectOf typeCode="SUBJ"> 
       <annotation classCode="ACT" moodCode="EVN"> 
      <code code="SETUPSCHEDULE"/> 
      <text><![CDATA[Set up: 6 days a week a.m.; Report available: 2-3 days]]></text> 
      <statusCode code="Updated"/> 
       </annotation> 
      </subjectOf> 
      </scheduleEvent> 
     </pertinentInformation3>     
       <pertinentInformation3 typeCode="PERT"> 
      <scheduleEvent classCode="ACT" moodCode="EVN" > 
      <subjectOf typeCode="SUBJ"> 
       <annotation classCode="ACT" moodCode="EVN"> 
      <code code="SETUPTIME"/> 
      <text><![CDATA[Set up: 6 days a week a.m.; Report available: 2-3 days]]></text> 
      <statusCode code="Updated"/> 
       </annotation> 
      </subjectOf> 
      </scheduleEvent> 
     </pertinentInformation3> 
       <pertinentInformation3 typeCode="PERT"> 
      <scheduleEvent classCode="ACT" moodCode="EVN" > 
      <subjectOf typeCode="SUBJ"> 
       <annotation classCode="ACT" moodCode="EVN"> 
      <code code="SETUPDAYS"/> 
      <text><![CDATA[Sets up 6 days a week.]]></text> 
      <statusCode code="Updated"/> 
       </annotation> 
      </subjectOf> 
      </scheduleEvent> 
     </pertinentInformation3> 
       <pertinentInformation3 typeCode="PERT"> 
      <scheduleEvent classCode="ACT" moodCode="EVN" > 
      <subjectOf typeCode="SUBJ"> 
       <annotation classCode="ACT" moodCode="EVN"> 
      <code code="REPORTAVAILABLE"/> 
      <text><![CDATA[2-3 days]]></text> 
      <statusCode code="Updated"/> 
       </annotation> 
      </subjectOf> 
      </scheduleEvent> 
     </pertinentInformation3>   
       <pertinentInformation6 typeCode="PERT"> 
      <specimenHandling classCode="ACT" moodCode="EVN" > 
      <subjectOf typeCode="SUBJ"> 
       <annotation classCode="ACT" moodCode="EVN"> 
      <code code="PREFERREDSPECIMEN"/> 
      <text><![CDATA[2 mL Second void urine <strong>or </strong>2-hour urine <strong>or </strong>&nbsp;2 mL Urine with no preservative]]></text> 
      <statusCode code="Updated"/> 
       </annotation> 
      </subjectOf> 
      </specimenHandling> 
     </pertinentInformation6> 
     <pertinentInformation6 typeCode="PERT"> 
      <specimenHandling classCode="ACT" moodCode="EVN" > 
      <subjectOf typeCode="SUBJ"> 
       <annotation classCode="ACT" moodCode="EVN"> 
      <code code="MINIMUMVOLUME"></code> 
      <text><![CDATA[1 mL]]></text> 
      <statusCode code="Updated"/> 
       </annotation> 
      </subjectOf> 
      </specimenHandling> 
     </pertinentInformation6> 
     <pertinentInformation6 typeCode="PERT"> 
      <specimenHandling classCode="ACT" moodCode="EVN" > 
      <subjectOf typeCode="SUBJ"> 
       <annotation classCode="ACT" moodCode="EVN"> 
      <code code="OTHERACCEPTABLESPECIMEN"></code> 
      <text><![CDATA[2 mL Second void urine <strong>or </strong>2-hour urine <strong>or </strong>&nbsp;2 mL Urine with no preservative]]></text> 
      <statusCode code="Updated"/> 
       </annotation> 
      </subjectOf> 
      </specimenHandling> 
     </pertinentInformation6> 
     <pertinentInformation6 typeCode="PERT"> 
      <specimenHandling classCode="ACT" moodCode="EVN" > 
      <subjectOf typeCode="SUBJ"> 
       <annotation classCode="ACT" moodCode="EVN"> 
      <code code="INSTRUCTIONS"></code> 
      <text><![CDATA[<strong>Whole Blood: </strong>Normal phlebotomy procedure. Store and ship <br /> room temperature immediately. Do not freeze. <br /> <strong><br /> Saliva:</strong> Collect saliva using Oragnene self collection kit. Store and ship room temperatur immediately. Do not freeze.]]></text> 
      <statusCode code="Updated"/> 
       </annotation> 
      </subjectOf> 
      </specimenHandling> 
     </pertinentInformation6> 
     <pertinentInformation6 typeCode="PERT"> 
      <specimenHandling classCode="ACT" moodCode="EVN" > 
      <subjectOf typeCode="SUBJ"> 
       <annotation classCode="ACT" moodCode="EVN"> 
      <code code="TRANSPORTCONTAINER"></code> 
      <text><![CDATA[APTIMA<sup>&reg;</sup> transport tube]]></text> 
      <statusCode code="Updated"/> 
       </annotation> 
      </subjectOf> 
      </specimenHandling> 
     </pertinentInformation6> 
     <pertinentInformation6 typeCode="PERT"> 
      <specimenHandling classCode="ACT" moodCode="EVN" > 
      <subjectOf typeCode="SUBJ"> 
       <annotation classCode="ACT" moodCode="EVN"> 
      <code code="TRANSPORTTEMPERATURE"></code> 
      <text><![CDATA[<p>Refrigerated (cold packs)</p>]]></text> 
      <statusCode code="Updated"/> 
       </annotation> 
      </subjectOf> 
      </specimenHandling> 
     </pertinentInformation6> 
     <pertinentInformation6 typeCode="PERT"> 
      <specimenHandling classCode="ACT" moodCode="EVN" > 
      <subjectOf typeCode="SUBJ"> 
       <annotation classCode="ACT" moodCode="EVN"> 
      <code code="SPECIMENSTABILITY"></code> 
      <text><![CDATA[Room temperature: 48 hours<br /> Refrigerated: 7 days<br /> Frozen: 30 days]]></text> 
      <statusCode code="Updated"/> 
       </annotation> 
      </subjectOf> 
      </specimenHandling> 
     </pertinentInformation6> 
     <pertinentInformation6 typeCode="PERT"> 
      <specimenHandling classCode="ACT" moodCode="EVN" > 
      <subjectOf typeCode="SUBJ"> 
       <annotation classCode="ACT" moodCode="EVN"> 
      <code code="REJECTCRITERIA"></code> 
      <text><![CDATA[Specimens containing heparin; Leaking samples; Uncapped samples; Broken container; Non Aptima; Vaginal Swab Collection Kit]]></text> 
      <statusCode code="Updated"/> 
       </annotation> 
      </subjectOf> 
      </specimenHandling> 
     </pertinentInformation6> 
     <pertinentInformation6 typeCode="PERT"> 
      <specimenHandling classCode="ACT" moodCode="EVN" > 
      <subjectOf typeCode="SUBJ"> 
       <annotation classCode="ACT" moodCode="EVN"> 
      <code code="PATIENTPREPARATION"></code> 
      <text><![CDATA[<br/><b> Patient preparation:</b></br> Collect peak at end of 60 minutes IV infusion, 30 minutes after end of IV infusion, or 30-60 minutes after IM dose]]></text> 
      <statusCode code="Updated"/> 
       </annotation> 
      </subjectOf> 
      </specimenHandling> 
     </pertinentInformation6>   
     <pertinentInformation7 typeCode="PERT"> 
      <medicalInformation classCode="ACT" moodCode="EVN"> 
      <subjectOf typeCode="SUBJ"> 
       <annotation classCode="ACT" moodCode="EVN"> 
      <code code="METHODOLOGY"/> 
      <text><![CDATA[Real-Time Polymerase Chain Reaction (RT-PCR)]]></text> 
      <statusCode code="Updated"/> 
       </annotation> 
      </subjectOf> 
      </medicalInformation> 
     </pertinentInformation7> 
     <pertinentInformation7 typeCode="PERT"> 
      <medicalInformation classCode="ACT" moodCode="EVN"> 
      <subjectOf typeCode="SUBJ"> 
       <annotation classCode="ACT" moodCode="EVN"> 
      <code code="CLINICALSIGNIFICANCE"/> 
      <text><![CDATA[Maternal Cell Contamination Study, STR Analysis, provides assurance that test results from fetal specimens are not influenced by contaminating maternal material. This test also allows for establishing the proper maternal-fetal relationship between specimens by using sophisticated analysis of 15 highly polymorphic STR loci.]]></text> 
      <statusCode code="Updated"/> 
       </annotation> 
      </subjectOf> 
      </medicalInformation> 
     </pertinentInformation7> 
     <pertinentInformation7 typeCode="PERT"> 
      <medicalInformation classCode="ACT" moodCode="EVN"> 
      <subjectOf typeCode="SUBJ"> 
       <annotation classCode="ACT" moodCode="EVN"> 
      <code code="LIMITATION"/> 
      <text><![CDATA[Variations in two genes (VKORC1 and CYP2C9) are particularly important in warfarin metabolism. VKORC1 may explain 30% of the variability in drug response between patients and changes in CYP2C9 may explain 10% of the dose variation. While significant portion of the dose variability can be accounted for by genetic factors, this testing will not determine all factors associated with dose variability.]]></text> 
      <statusCode code="Updated"/> 
       </annotation> 
      </subjectOf> 
      </medicalInformation> 
     </pertinentInformation7> 
     <pertinentInformation7 typeCode="PERT"> 
      <medicalInformation classCode="ACT" moodCode="EVN"> 
      <subjectOf typeCode="SUBJ"> 
       <annotation classCode="ACT" moodCode="EVN"> 
      <code code="ASSAYVIEW"/> 
      <text><![CDATA[Sample Value]]></text> 
      <statusCode code="Updated"/> 
       </annotation> 
      </subjectOf> 
      </medicalInformation> 
     </pertinentInformation7> 
     <pertinentInformation7 typeCode="PERT"> 
      <medicalInformation classCode="ACT" moodCode="EVN"> 
      <subjectOf typeCode="SUBJ"> 
       <annotation classCode="ACT" moodCode="EVN"> 
      <code code="INDICATIONS"/> 
      <text><![CDATA[Sample Value]]></text> 
      <statusCode code="Updated"/> 
       </annotation> 
      </subjectOf> 
      </medicalInformation> 
     </pertinentInformation7>   
      </order> 
     </subjectOf> 
     <coveredPartyOf typeCode="COV"> 
      <financialTransactionEvent classCode="XACT" moodCode="EVN"> 
     <id extension="12343" assigningAuthorityName="BILLCODE"/> 
     <subjectOf typeCode="SUBJ"> 
      <annotation classCode="ACT" moodCode="EVN" > 
       <realmCode code="QD" /> 
       <code code="CPTCODE"></code> 
       <text><![CDATA[Sample Value]]></text><!-- CPT Code information would be passed here --> 
       <statusCode code="Updated"/><!-- Updated Flag for this field--> 
      </annotation> 
     </subjectOf> 
      </financialTransactionEvent> 
     </coveredPartyOf> 
     </testCodeIdentifier> 
     </subject> 
     <custodian contextControlCode="AP" typeCode="CST"> 
      <assignedDevice classCode="ASSIGNED"> 
      <realmCode code="QD" /> 
      <id extension="QTIM"/> 
      <assignedRepository classCode="DEV" determinerCode="INSTANCE"> 
       <name/> 
      </assignedRepository> 
      </assignedDevice> 
     </custodian> 
     </registrationEvent> 
    </subject> 
    </controlActEvent> 
</QDTM_IN300301QD> 

我有上面的XML使用解析XPath的;我使用頂部的代碼解析使用。我想我做的事情錯了,因爲當代碼標記代碼屬性=「CPTCODE」

在此先感謝訪問它不取文本標籤的數據...

回答

0

這是XPath的最常見問題解答(搜索XPath和默認名稱空間)。

簡而言之,Xpath總是將前綴名稱視爲屬於「no namespace」。

如果一個XML文檔有沒有默認命名空間,用前綴的名稱的任何元素並不真正屬於「沒有命名空間」和表達:

/name1/name2 

選擇命名name2任何元素是頂級元素的子名爲name1

在當XML文檔具有全局定義的默認名稱空間相同的表達式的情況下:

/name1/name2 

選擇無關,因爲在「沒有命名空間」無元素(所有元素都在默認情況下,非-empty命名空間),因此嘗試選擇名稱爲name1,name2whatevername的元素會導致選擇0個元素。

解決方案

使用您的XPath ENGIN API爲 「註冊一個命名空間」 和與之相關聯的前綴,說"x"。然後將表達式重寫爲:

/x:name1/x:name2 

該最後一個表達式正確選擇所需節點。

相關問題