xml文件解析基础和签名

0. 前言

1.xml文件的解析

1.1 基本的jdk解析xml的原始api解析

  • 声明
  • 1.以下代码块要放到一个类中才能运行
  • dom类型为:org.w3c.dom.*
  • 解析的包:javax.xml.*

1.1.1 输出所xml所有节点内容

/**
 * 如同js一样的获取节点内容
 */
public static void listNl(NodeList nl) {
    int len = nl.getLength();
    for (int i = 0; i < len; i++) {
        Element eltStudent = (Element) nl.item(i);
        Node eltName = eltStudent.getElementsByTagName("name").item(0);
        Node eltAge = eltStudent.getElementsByTagName("age").item(0);
        String name = eltName.getFirstChild().getNodeValue();
        String age = eltAge.getFirstChild().getNodeValue();
        System.out.print("姓名:");
        System.out.println(name);
        System.out.print("年龄:");
        System.out.println(age);
        System.out.println("------------------------");
    }
}
@Test
/**
 * 输出所xml所有节点内容
 */
// 示例地址:http://it.chinawin.net/softwaredev/article-16023.html
public void test_ParseXml1Net_01() throws Exception {
    String path = "D:\\workspace\\java_base\\src\\hw\\learn\\simple\\xml\\student.xml";
    FileInputStream fis = new FileInputStream(new File(path));
    DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = f.newDocumentBuilder();
    Document doc = builder.parse(fis);
    NodeList nl = doc.getElementsByTagName("student");
    listNl(nl);
}

1.1.2 将字符串转化为xml文件

/**
 * 将字符串转化为xml文件
 *//***/
@Test
public void test_String2Xml() throws Exception {
    // String xmlStr = new String("ASDFADADSD");//报错:[Fatal Error] :1:1: 前言中不允许有内容。
    String xmlStr = new String("<?xml version=\"1.0\" encoding=\"GB2312\"?><students><student sn=\"01\"><name>张三</name><age>18</age></student><student sn=\"02\"><name>李四</name><age>20</age></student></students>");
    StringReader sr = new StringReader(xmlStr);
    InputSource is = new InputSource(sr);
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document doc = builder.parse(is);
    System.out.println(doc.getClass());//com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl
}

1.1.3 将xml文件转化为字符串

/**
 * 读取本地文件xml文件为Document对象
 */
public static Document test_readXml() throws Exception {
    String path = "D:\\workspace\\java_base\\src\\hw\\learn\\simple\\xml\\student.xml";
    FileInputStream fis = new FileInputStream(new File(path));
    DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = f.newDocumentBuilder();
    Document doc = builder.parse(fis);
    System.out.println(doc);// ★★[#document: null]注意这里不是打印出来xml文件内容,并不代表没有读到xml文件
    return doc;
}
@Test
/**
 * 将xml文件转化为字符串
 */
public void test_Xml2String() throws Exception {
    Document doc = this.test_readXml();
    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer t = tf.newTransformer();
    t.setOutputProperty("encoding", "UTF-8");
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    t.transform(new DOMSource(doc), new StreamResult(bos));
    String xmlStr = bos.toString();
    System.out.println(xmlStr);
}

1.2 使用dom4解析xml

  • 声明
  • 以下代码块要放到一个类中才能运行
  • dom类型和解析的包为:org.dom4j.*
  • ★注意:javax.xml.parsers中的和dom4j中的两种形式的Document不能转换

1.2.1将String转换为Dom4j的Document类对象

/**
 * 所以在应用时只能用一套xml解析方案,不能交替使用,否则报:ClassCastException异常
 * dom4j具体细节操作:参见http://www.cnblogs.com/liuling/archive/2013/02/05/dom4jxml.html
 *//***/
@Test
public void test_String2Xml_dom4j() throws DocumentException {
    String path = "D:\\workspace\\java_base\\src\\hw\\learn\\simple\\xml\\student.xml";
    String xmlStr = new String("<?xml version=\"1.0\" encoding=\"GB2312\"?><students><student sn=\"01\"><name>张三</name><age>18</age></student><student sn=\"02\"><name>李四</name><age>20</age></student></students>");
    Document document = DocumentHelper.parseText(xmlStr);// 必须引入dom4j的Document
}

1.2.2 最普通的方法得到xml文件信息

@Test
/**
 * 方法1:将xml文件看成普通文本文件输出字符信息
 */
public void test_OrdTextReadXml() throws Exception {
    String path = "D:\\workspace\\java_base\\src\\hw\\learn\\simple\\xml\\student.xml";
    File f = new File(path);
    InputStream in = new FileInputStream(f);
    byte[] b = new byte[1024];
    in.read(b);
    in.close();
    System.out.println(new String(b));
}

@Test
/**
 * ★★方法2:解析后读取xml文件中所有节点信息,
 */
public void test_Xml2String_dom4j() throws Exception {
    SAXReader sr = new SAXReader();// 获取读取xml的对象。
    String path = "D:\\workspace\\java_base\\src\\hw\\learn\\simple\\xml\\student.xml";
    Document doc = sr.read(path);// 得到xml所在位置。然后开始读取。并将数据放入doc中
    Element el_root = doc.getRootElement();// 向外取数据,获取xml的根节点。
    Iterator it = el_root.elementIterator();// 从根节点下依次遍历,获取根节点下所有子节点
    while (it.hasNext()) {// 遍历该子节点
        Object o = it.next();// 再获取该子节点下的子节点
        Element el_row = (Element) o;
        String s = el_row.getText();
        Iterator it_row = el_row.elementIterator();
        while (it_row.hasNext()) {// 遍历节点
            Element el_ename = (Element) it_row.next();// 获取该节点下的所有数据。
            System.out.println(el_ename.getText());
        }
    }
}

@Test
/**
 * 方法三:使用elements方法进行xml的读取,相当于条件查询,可以根据不同的节点,利用for循环查询该节点下所有的数据。
 * 依据不同的xml文件而定
 */
public void test_ByElement() throws Exception {
    SAXReader sr = new SAXReader();// 获取读取方式
    String path = "D:\\workspace\\java_base\\src\\hw\\learn\\simple\\xml\\student.xml";
    Document doc = sr.read(path);// 读取xml文件,并且将数据全部存放到Document中
    Element root = doc.getRootElement();// 获取根节点
    List list = root.elements("student");// 根据根节点,将根节点下 student中的所有数据放到list容器中。
    for (Object obj : list) {// 这种遍历方式,是jdk1.5以上的版本支持的遍历方式
        Element row = (Element) obj;
        List list_name = row.elements("name");// 获取name节点下所有的内容,存入list_row容器中
        for (Object objempno : list_name) {
            Element el_empno = (Element) objempno;
            System.out.println(el_empno.getName() + ": " + el_empno.getText());// 获取节点下的数据。
        }
    }
}

@Test
/**
 * 方法四:使用selectNodes()方法
 */
public void test_bySelectNode() throws Exception {
    String elementpath = new String("name");// 使用selectNodes获取所要查询xml的节点。
    SAXReader sr = new SAXReader();
    String path = "D:\\workspace\\java_base\\src\\hw\\learn\\simple\\xml\\student.xml";
    Document doc = sr.read(path);
    List list = doc.selectNodes(elementpath);
    for (Object obj : list) {// 遍历节点,获取节点内数据。
        Element el = (Element) obj;
        System.out.println(el.getText());
    }
}

2. xml签名

xml作为一种通用跨平台的数据传输的方式,其安全性也受到重视,很多应用或商家在用xml文件之间传输信息时通常要对xml文件进行签名,以确定数据的完整性,以及防篡改。下面是在工作中遇到的签名xml文件的一种方式。

public class SignXml {
    // 参考文档:http://www.javacodegeeks.com/2013/10/xml-security-with-digital-signature-in-java.html
    /**
     * @param doc 待签名的xml文档
     * @param privateKey  用于对xml签名的私钥
     * @return 已签名的xml文档
     */
    public static Document signXmlDoc(Document doc, PrivateKey privateKey) throws Exception {
        // 创建XML签名工厂
        XMLSignatureFactory xmlSigFactory = XMLSignatureFactory.getInstance("DOM");
        DOMSignContext domSignCtx = new DOMSignContext(privateKey, doc.getDocumentElement());
        System.out.println(domSignCtx);
        javax.xml.crypto.dsig.Reference ref = null;
        SignedInfo signedInfo = null;
        try {
            ref = xmlSigFactory.newReference("#CUSTINFOREQ", xmlSigFactory.newDigestMethod(DigestMethod.SHA1, null), Collections.singletonList(xmlSigFactory.newTransform(Transform.ENVELOPED, (TransformParameterSpec) null)), null, null);
            signedInfo = xmlSigFactory.newSignedInfo(xmlSigFactory.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE, (C14NMethodParameterSpec) null), xmlSigFactory.newSignatureMethod(SignatureMethod.RSA_SHA1, null), Collections.singletonList(ref));
            System.out.println(signedInfo);
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new RuntimeException(ex);
        }
        KeyInfo ki = null;
        // 创建新的XML签名
        XMLSignature xmlSignature = xmlSigFactory.newXMLSignature(signedInfo, ki);
        try {
            // 对文档签名
            xmlSignature.sign(domSignCtx);
            // ★打印出来xml文档:查看签名信息!【org.dom.Document->String】
            System.out.println("#Begin:get signedXmlDoc********************************");
            TransformerFactory tf = TransformerFactory.newInstance();
            Transformer t = tf.newTransformer();
            t.setOutputProperty("encoding", "GB23121");
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            t.transform(new DOMSource(doc), new StreamResult(bos));
            String xmlStr = bos.toString();
            System.out.println(xmlStr);
            System.out.println("#End:get signedXmlDoc********************************");
            return doc;
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new RuntimeException(ex);
        }
    }
}
时间: 2024-10-09 07:07:40

xml文件解析基础和签名的相关文章

QT开发(四十一)——XML文件解析基础

QT开发(四十一)--XML文件解析基础 一.XML文档简介 XML(Extensible Markup Language,可扩展标记语言),是一种通用的文本格式,被广泛运用于数据交换和数据存储,而不是显示数据.XML的标签没有被预定义,用户需要在使用时自行进行定义.XML是W3C(万维网联盟)的推荐标准.相对于数据库表格的二维表示,XML使用的树形结构更能表现出数据的包含关系,作为一种文本文件格式,XML简单明了的特性使得它在信息存储和描述领域非常流行. <?xml version="1

android基础知识13:AndroidManifest.xml文件解析

1.重要性 AndroidManifest.xml是Android应用程序中最重要的文件之一.它是Android程序的全局配置文件,是每个 android程序中必须的文件.它位于我们开发的应用程序的根目录下,描述了package中的全局数据,包括package中暴露的组件 (activities, services, 等等),以及他们各自的实现类,各种能被处理的数据和启动位置等重要信息. 因此,该文件提供了Android系统所需要的关于该应用程序的必要信息,即在该应用程序的任何代码运行之前系统所

java基础之概谈xml文件解析

XML已经成为一种很通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.诸多web应用框架,其可配置的编程方式,给我们的开发带来了很大程度的便捷,但细细想来,它们的应用无一不是java bean与xml之间的转换解析.本文将对xml的两种操作标准DOM和SAX,从它们各自的特点.适用范围等方面进行简单介绍. DOM (Document Object Model) :DOM标准中,采用W3C标准表示XML,有多重语言支持,因此其跨平台性很好.采用DOM规范

XML文件解析【安卓7】——SAX解析

XML文件解析 XML解析:XML技术是Android平台的应用基础,  Android提供了多种解析XML的方式:SAX解析.DOM解析.PULL解析 SAX解析 SAX --Simple  API  forXML  (XML简单的API) --解析速度快.占用内存少 --提供一组简单的API用于解析XML文件 --SAX在解析XML文件前,先指定一个解析事件处理器(Handler),SAX会对XML文档进行简单的顺序扫描,当扫描到[文档(Document)的开始和结束.元素(Element)

通过正则表达式实现简单xml文件解析

这是我通过正则表达式实现的xml文件解析工具,有些XHTML文件中包含特殊符号,暂时还无法正常使用. 设计思路:常见的xml文件都是单根树结构,工具的目的是通过递归的方式将整个文档树装载进一个Node对象.xml文档树上的每一个节点都是一个Node对象,对象拥有title.attribute和text三个自身变量以及一个childrenNode集合. 一.编写Node类 import java.io.Serializable; import java.util.HashMap; import j

XML文件解析之JDOM解析

1.JDOM介绍 JDOM的官方网站是http://www.jdom.org/,JDOM解析用到的jar包可以在http://www.jdom.org/dist/binary/中下载,最新的JDOM2的版本是2.0.5,JDOM1的版本是1.1.3,根据官网中的介绍可以知道.JDOM是一个在基于内存的XML模型,它用于读写创建修改XML文档.JDOM和DOM相似因为他们都提供了内存XML文档模型,但是DOM被设计用于很多种语言(C,C++,ECMSctipr,Java,JScript,Lingo

XML文件解析器TXml

前几天看了开源的XML文件解析器TinyXml,它是怎么实现解析的没怎么看懂,于是决定自己实现一个,反正最近不忙.先命名为TXml.现在完成了解析和查询功能,全部代码加起来不到1000行,将会继续完善它.源码必共享 先简单说一下我的思路: 1:读取XML文件信息,并存入一个字符数组中: 2:遍历数组,将数组解析成一棵树: 3:以路径的方式查询和按属性查询: 这个解析器最麻烦的地方就在怎么将字符数组解析成一颗树.我们先看一下一个简单XML文件,他包括文件头.节点.节点名称及节点值.属性名称及属性值

八、Android学习第七天——XML文件解析方法(转)

(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 八.Android学习第七天——XML文件解析方法 XML文件:extensible markup language 定义:用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 解析XML的方式: SAX——Simple API for XML,既是一种接口,也是一个软件包采用的是事件驱动,也就是它解析

Win10系列:VC++ XML文件解析

XML文件按照元素标记来存储数据,通过遍历这些元素标记可以得到XML文件中所保存的数据.在C++/CX的类库中并未定义用于解析XML文件的类,但C++提供了能解析XML文件的框架和类库,如msxml4.libxml.IXMLDOM和TinyXML等,在使用C++/CX编写应用程序时可以通过C++提供的框架和类库来解析XML文件.TinyXML是一个轻量级解析XML的框架,本节将介绍如何使用此框架来解析一个XML文件. TinyXML框架包含了以下的类和函数,通过使用这些类和函数可以方便地读取一个