dom4j selectNodes 取不到值 因为XML带有命名空间 HL7

简介: dom4j selectNodes 取不到值 因为XML带有命名空间 HL7

xml 如下:

<?xml version="1.0" encoding="UTF-8"?>
<POOR_IN200901UV ITSVersion="XML_1.0" xmlns="urn:hl7-org:v3"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="urn:hl7-org:v3 ../../Schemas/POOR_IN200901UV20.xsd">
    <id extension="BS002" />
    <creationTime value="20120106110000" />
    <interactionId root="2.16.840.1.113883.1.6" extension="POOR_IN200901UV20" />
    <processingCode code="P" />
    <!-- 消息处理模式: A(Archive); I(Initial load); R(Restore from archive); T(Current 
        processing) -->
    <processingModeCode code="T" />
    <!-- 消息应答: AL(Always); ER(Error/reject only); NE(Never) -->
    <acceptAckCode code="NE" />
    <!-- 接受者 -->
    <receiver typeCode="RCV">
        <device classCode="DEV" determinerCode="INSTANCE">
            <!-- 接受者ID -->
            <id>
                <item root="1.2.156.456150488.1.1.19" extension=""/>
            </id>
        </device>
    </receiver>
    <!-- 发送者 -->
    <sender typeCode="SND">
        <device classCode="DEV" determinerCode="INSTANCE">
            <!-- 发送者ID -->
            <id>
                <item root="1.2.156.456150488.1.1.19" extension="S002"/>
            </id>
        </device>
    </sender>
    <controlActProcess classCode="CACT" moodCode="EVN">
        <!-- 消息交互类型 @code: 新增 :new 删除:delete 补发:replace-->
        <code code="new"></code>
        <subject typeCode="SUBJ" xsi:nil="false">
            <placerGroup classCode="GROUPER" moodCode="RQO">
                <subject typeCode="SBJ">
                    <patient classCode="PAT">
                        <id>
                            <!-- 域ID -->
                            <item root="1.2.156.456150488.1.2.1.2" extension="01" />
                            <!-- 患者ID -->
                            <item root="1.2.156.456150488.1.2.1.3" extension="09102312" />
                            <!-- 就诊号 -->
                            <item root="1.2.156.456150488.1.2.1.12" extension="0910238" />
                        </id>
                        <!-- 病区编码/病区名 床号 -->
                        <addr xsi:type="BAG_AD">
                            <item use="TMP">
                                <part type="BNR" value="9A血液科" code="09808" codeSystem="1.2.156.456150488.1.1.33"/>
                                <part type="CAR" value="06" />
                            </item>
                        </addr>
                    </patient>
                </subject>
    </controlActProcess>
</POOR_IN200901UV>

三种取值方法,命名空间:xmlns="urn:hl7-org:v3"

/**
 * 推荐使用
 * @throws Exception
*/
@Test
void hl7V3Parse1() throws Exception {
    String xmlPath = "D:\\BS002.xml";
    File xmlFile = new File(xmlPath);
    SAXReader reader = new SAXReader();
    Document doc = reader.read(xmlFile);
    //添加命名空间
    Map<String, String> xmlMap = new HashMap<>();
    xmlMap.put("s", "urn:hl7-org:v3");
    //作用域在文档上,方便多次 select Node
    reader.getDocumentFactory().setXPathNamespaceURIs(xmlMap);
    Node interactionId = doc.selectSingleNode("s:POOR_IN200901UV/s:creationTime/@value");
    System.out.println(interactionId.getText());
    //当有多个item 时,指定 root = 1.2.156.456150488.1.2.1.3 的 extension 值
    Node patientLidNode = doc.selectSingleNode("/s:POOR_IN200901UV/s:controlActProcess/s:subject/s:placerGroup/s:subject/s:patient/s:id/s:item[@root='1.2.156.456150488.1.2.1.3']/@extension");
    System.out.println(patientLidNode.getText());
}
/**
 * 不太方便
 * @throws Exception
*/
@Test
void hl7V3Parse2() throws Exception {
    String xmlPath = "D:\\BS002.xml";
    File xmlFile = new File(xmlPath);
    SAXReader reader = new SAXReader();
    Document doc = reader.read(xmlFile);
    //添加命名空间
    Map<String, String> xmlMap = new HashMap<>();
    xmlMap.put("s", "urn:hl7-org:v3");
    //作用域在 XPath 上
    XPath xPath = doc.createXPath("s:POOR_IN200901UV/s:creationTime/@value");
    xPath.setNamespaceURIs(xmlMap);
    Node name = xPath.selectSingleNode(doc);
    System.out.println(name.getText());
}
/**
 * HL7 节点太多,这种方法相当麻烦
 * @throws Exception
*/
@Test
void hl7V3Parse3() throws Exception {
    String xmlPath = "D:\\BS002.xml";
    File xmlFile = new File(xmlPath);
    SAXReader reader = new SAXReader();
    Document doc = reader.read(xmlFile);
    Attribute name = doc.getRootElement().element("creationTime").attribute("value");
    System.out.println(name.getValue());
}

 

赋值,保存 HL7 XML

void hl7ParseBS004() throws Exception {
    String xmlPath = "D:\\BS004.xml";
    String savePath = "D:\\BS004_save.xml";
    File xmlFile = new File(xmlPath);
    SAXReader reader = new SAXReader();
    Document doc = reader.read(xmlFile);
    //添加命名空间
    Map<String, String> xmlMap = new HashMap<>();
    xmlMap.put("s", "urn:hl7-org:v3");
    //作用域在文档上,方便多次 select Node
    reader.getDocumentFactory().setXPathNamespaceURIs(xmlMap);
 
    //消息创建时间
    Node creationTimeNode = doc.selectSingleNode("/s:POOR_IN200901UV/s:creationTime/@value");
    creationTimeNode.setText(DateUtil.format(new Date(), "yyyyMMddHHmmss")); 
    OutputFormat outputFormat = OutputFormat.createPrettyPrint();
    outputFormat.setEncoding("UTF-8");
    XMLWriter writer = null;
    try {
        writer = new XMLWriter(new FileWriter(savePath), outputFormat);
        writer.write(doc);
        writer.flush();
        writer.close();
    } catch (Exception e) {
        e.printStackTrace();
    } 
}

 

目录
相关文章
|
2月前
|
XML JavaScript Java
【JAVA XML 探秘】DOM、SAX、StAX:揭秘 Java 中 XML 解析技术的终极指南!
【8月更文挑战第25天】本文详细探讨了Java中三种主流的XML解析技术:DOM、SAX与StAX。DOM将XML文档转换为树状结构,便于全方位访问和修改;SAX采取事件驱动模式,适用于大型文件的顺序处理;StAX则兼具DOM和SAX的优点,支持流式处理和随机访问。文中提供了每种技术的示例代码,帮助读者理解如何在实际项目中应用这些解析方法。
111 1
|
3月前
|
XML JavaScript 数据格式
XML DOM 浏览器差异
所有 modern browsers 支持 W3C DOM 规范, 但仍存在差异, 主要是处理空白和换行的不同。例如, 在 XML 中, Internet Explorer 不会将空白或换行视为文本节点, 而其他浏览器则会。这会导致相同的 XML 文档在 IE 中的子节点数为 4, 而在其他浏览器中为 9:
|
3月前
|
XML JavaScript 数据格式
XML DOM 浏览器差异
所有 modern browsers 支持 W3C DOM, 但在处理空白和换行上存在差异。例如, 使用记事本编辑的 XML 可能包含 CR/LF 和额外空格。IE 不将空白视作文本节点, 与其他浏览器不同。
|
3月前
|
XML JavaScript 数据格式
XML DOM 浏览器差异
所有 modern browsers 支持 W3C DOM, 但在处理空白和换行上存在差异。例如, 使用记事本编辑的 XML 可能包含 CR/LF 和额外空格。IE 不将空白视作文本节点, 而其他浏览器则会。这会导致对相同 XML 文档的 `childNodes` 长度计算不同: IE 显示 4 个子节点, 其他浏览器显示 9 个。
|
3月前
|
XML 存储 JavaScript
XML DOM - 访问节点
通过 DOM, 可全面访问 XML 文档的节点。实现这一目标有 3 种方法: 1. 使用 `getElementsByTagName()` 方法, 2. 遍历节点树, 3. 利用节点间的关联进行导航。 `getElementsByTagName()` 返回一个 Node List, 即节点数组。
|
3月前
|
XML JavaScript 数据格式
XML DOM 浏览器差异
输出子节点的数量。结果取决于您所使用的浏览器。IE 浏览器会输出 4(提醒 4 个子节点),而其他浏览器会输出 9(提醒 9 个子节点)。
|
3月前
|
XML JavaScript 数据格式
XML DOM 遍历节点树
遍历(Traverse)意味着在节点树中进行循环或移动。
|
3月前
|
XML JavaScript 数据格式
XML DOM 遍历节点树
遍历(Traverse)意味着在节点树中进行循环或移动。
|
3月前
|
XML 存储 JavaScript
XML DOM - 访问节点
通过 DOM, 可全面访问 XML 文档的节点。实现这一目标有 3 种方法: - 使用 `getElementsByTagName()` 方法, - 循环遍历节点树, - 利用节点间关系进行导航。 `getElementsByTagName()` 返回一个 Node List,即一种节点数组形式。示例代码通过 `loadXMLDoc()` 函数加载 &quot;books.xml&quot; 文件到 `xmlDoc` 变量中,并随后在变量 `x` 中保存所需节点信息。
|
3月前
|
XML Web App开发 JavaScript
XML DOM 解析器
解析器把 XML 转换为 JavaScript 可存取的对象(XML DOM)。