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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.