XML创建/解析/验证


最近用到XML结合JMS TextMessage传输数据的技术。采用TextMessage+XML格式传输对象是考虑到这个平台不仅仅使用Java语言开发,同时还需要能够支持其他语言接入:比如C, Ruby, Perl, Python, PHP, ActionScript/Flash, Smalltalk,借助于ActiveMQ提供的Stomp,这些非Java语言能够很方便的就接入平台。

总结下来整个传输过程如下(Java to Java):

DTO对象->XML对象->XML文本->JMS TextMessage->XML文本->XML对象->DTO

对象

涉及技术点:

  1. JavaDTO对象如何转变为XML对象
  2. 如何从XML对象中获得XML文本
  3. 如何通过XML文本构造XML对象
  4. 遍历XML对象创建JavaDTO对象

先说第一点,JavaDTO对象如何转变为XML对象

// 创建DocumentBuilderFactory,创建和解析XML都需要
DocumentBuilderFactory domfac = DocumentBuilderFactory.newInstance();
// 创建DocumentBuilder
DocumentBuilder builder = domfac.newDocumentBuilder();
// 新建文档
Document doc = builder.newDocument();
doc.setXmlVersion("1.0");
// 创建文档根节点
Element root = doc.createElement("root");
// 循环创建叶子节点
Element leaf = doc.createElement("leaf");
// 添加叶子节点属性
leaf.setAttribute("name", "从Java对象中获取");
// 增加叶子节点至根节点
root.appendChild(leaf);

至此,XML对象已经创建完成,现在需要从XML对象中获取XML文本。


// 创建TransformerFactory
TransformerFactory transFactory = TransformerFactory.newInstance();
// 创建XML对象解析工具类
Transformer transformer = transFactory.newTransformer(); 
// 创建字节数组缓冲区
ByteArrayOutputStream out = new ByteArrayOutputStream();
// 创建转换结果的持有者
StreamResult xmlResult = new StreamResult(out); 
// 以 Document Object Model(DOM)树的形式充当转换 Source 树的持有者
DOMSource domSource = new DOMSource(doc); 

// 验证XML(暂时省略)

// 开始转换
transformer.transform(domSource, xmlResult);
// 获得字符串文本
String str = out.toString();

xml文本获取成功后,设置到TextMessage中就可以开始传输了。下面介绍根据XML文本串构造XML对象

// 唯一需要注意的一步,把文本串包装为ByteArrayInputStream对象
InputStream in = new ByteArrayInputStream(xmlText.getBytes("UTF-8")); // 省略若干步// 获取属性时需要注意
// 获得根节点下所有节点
NodeList nodeList = root.getDocumentElement().getChildNodes();
// 获得节点对象
Node node = nodeList.item(i);
// 获得节点属性值
nodeMap.getNamedItem("name").getNodeValue();

Java对象和XML对象互换问题解决之后,现在可以考虑XML验证的问题。XML验证一共有两种方法:XML Schema和XML DTD,无论Schema还是DTD都需要编写描述文件,本次选用了Schema验证方式。

XML Schema描述文件以xsd结尾,内容使用XML格式描述,我的XML文件格式如下:

<?xml version="1.0"?>
<root>
  <leaf name="l1" type=""/>
  <leaf name="l2" />
</root>

对应的xsd文件内容如下:

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="root">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="leaf" minOccurs="1" maxOccurs="512">
          <xsd:complexType>
            <xsd:attribute name="name" type="xsd:string" use="required" />
            <xsd:attribute name="type" type="fieldType" />
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:simpleType name="fieldType">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="STRING"/>
      <xsd:enumeration value="BOOLEAN"/>
      <xsd:enumeration value="NUMBER"/>
      <xsd:enumeration value="DATE"/>
    </xsd:restriction>
  </xsd:simpleType>
</xsd:schema>

解释:

minOccurs和maxOccurs指明了leaf节点出现的最少次数和最大次数,

xsd:simpleType创建了一个枚举类型,供type属性使用

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s