类 XmlSupport

java.lang.Object
com.midi.his.sdk.esb.XmlSupport

public final class XmlSupport extends Object
XML 读写工具:安全解析、序列化、节点查找与 CDATA 包装。

解析器统一禁用 DTD 与外部实体,避免平台报文被用作 XXE 入口;文档工厂每次新建, 因为 DocumentBuilder 不是线程安全的。

  • 方法详细资料

    • parse

      public static Document parse(String xml)
      解析一段 XML,禁止 DOCTYPE 声明与外部实体。
      参数:
      xml - 原文
      返回:
      DOM 文档
      抛出:
      HisProtocolException - 内容不是合法 XML
    • serialize

      public static String serialize(Node node)
      序列化节点,不带 XML 声明(用于嵌进 CDATA 的业务报文)。
      参数:
      node - 节点
      返回:
      XML 文本
      抛出:
      HisProtocolException - 序列化失败
    • serialize

      public static String serialize(Node node, boolean omitDeclaration)
      序列化节点。
      参数:
      node - 节点
      omitDeclaration - 是否省略 <?xml ...?>
      返回:
      XML 文本
      抛出:
      HisProtocolException - 序列化失败
    • newDocument

      public static Document newDocument()
      创建空文档。
      返回:
      新文档
      抛出:
      HisProtocolException - 工厂初始化失败
    • appendText

      public static Element appendText(Document owner, Element parent, String name, String text)
      追加子元素并设置文本,文本为 null 时生成空节点。
      参数:
      owner - 所属文档
      parent - 父节点
      name - 元素名
      text - 文本值
      返回:
      新建元素
    • appendElement

      public static Element appendElement(Document owner, Element parent, String name)
      追加无文本的子元素。
      参数:
      owner - 所属文档
      parent - 父节点
      name - 元素名
      返回:
      新建元素
    • firstChild

      public static Element firstChild(Element parent, String... names)
      取第一个直接子元素。
      参数:
      parent - 父节点
      names - 候选元素名,按顺序尝试
      返回:
      匹配元素,找不到时 null
    • firstByLocalName

      public static Element firstByLocalName(Element root, String localName)
      取整个子树中第一个匹配名字的元素,用于跨命名空间前缀查找。
      参数:
      root - 根节点
      localName - 局部名
      返回:
      匹配元素,找不到时 null
    • children

      public static List<Element> children(Element parent, String name)
      列出全部直接子元素;name 传 "*" 时返回所有子元素。
      参数:
      parent - 父节点
      name - 元素局部名,或 "*"
      返回:
      元素列表,保持文档顺序
    • text

      public static String text(Element element)
      读元素文本;空节点返回空串,节点不存在由调用方处理。
      参数:
      element - 元素,可为 null
      返回:
      文本内容,元素为 null 时返回 null
    • attr

      public static String attr(Element element, String name)
      读元素属性。
      参数:
      element - 元素,可为 null
      name - 属性名
      返回:
      属性值,缺失时 null
    • localName

      public static String localName(Element element)
      返回:
      元素的局部名(忽略前缀)
    • wrapCdata

      public static String wrapCdata(String text)
      把文本安全地包进 CDATA:内容里出现 ]]> 时拆分成多段, 样例响应里的 ]]]]><![CDATA[> 正是这种拆分的结果。
      参数:
      text - 原文,可为 null
      返回:
      CDATA 片段,例如 <![CDATA[a]]]]><![CDATA[>b]]>
    • oneLine

      public static String oneLine(String text)
      DOM 解析出来的文本可能包含多段相邻 CDATA/文本节点,此方法用于把连续空白压回一行, 便于写日志。
      参数:
      text - 原文
      返回:
      单行文本