一、背景说明
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);
}