SAXReader通配符搜索XML節點

一、背景說明
    1、有時候對與層級比較多的節點需要使用搜索功能強大的XML解析功能。
    2、使用SAXReader實現的Document支持節點搜索功能。
二、實現原理
    1、將XML解析成流對象,使用sax的read方法返回document對象。
    2、用sax需要指定命名空間,之後節點中都要用命名空間的別稱,這個命名空間必須和XML結構中的相同。
    
    3、單斜槓(/)表示緊接着的根目錄。
    4、雙斜槓(//)表示該節點下任一層級。
    5、無斜槓表示根節點
    6、[@屬性名=屬性值]來添加屬性過濾條件。
三、具體實現
List<CheckReportOutput> checkReports = new ArrayList<CheckReportOutput>();
          SAXReader  reader = new SAXReader();
           Document doc = reader.read(new ByteArrayInputStream(xml.getBytes("UTF-8")));
            Element root = doc.getRootElement();
            //將xds註冊爲namesapce的名稱
            map.put("esb", "urn:hl7-org:v3");
            reader.getDocumentFactory().setXPathNamespaceURIs(map);
            List<Element> elements = root.selectNodes("//esb:ClinicalDocument");
            for(int i=0;i<elements.size();i++){
                Element element = elements.get(i);
                CheckReportOutput output = new CheckReportOutput();
                output.setReportDate(((List<Element>)element.selectNodes("//esb:section//esb:observation//esb:effectiveTime")).get(i).attributeValue("value"));
                output.setCheckDeptId("");
                output.setCheckDeptName(getElementText(element,i,"//esb:title"));
                              output.setCheckDoctorName(getElementText(element,i,"//esb:legalAuthenticator//esb:assignedEntity//esb:assignedPerson//esb:name"));
                output.setCheckOrderNo(getAttributeValue(element,i,"//esb:templateId[@assigningAuthorityName='XDS.DocumentUnique']","extension"));
                output.setCheckPosition(getAttributeValueByParent(element,i,"//esb:section//esb:entryRelationship//esb:qualifier//esb:name[@displayName='XDS.Bodypartexamied']","value","code"));
                output.setConclustion(getElementByParent(element,i,"//esb:structuredBody//esb:component//esb:section//esb:code[@code='18776-5']","text"));
                output.setItemName(getAttributeValue(element,i,"//esb:section//esb:observation//esb:id[@assigningAuthorityName='XDS.Studyname']","extension"));
                output.setMedCardNO("");
                output.setPatientName(getElementText(element,i,"//esb:patient/esb:name"));
                output.setResult(((List<Element>)element.selectNodes("//esb:section/esb:text")).get(i).getText());
                output.setCheckDate(getAttributeValue(element,i,"//esb:author/esb:time","value"));
                checkReports.add(output);
            }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章