📜  Apache Xerces-XML概述(1)

📅  最后修改于: 2023-12-03 15:13:26.615000             🧑  作者: Mango

Apache Xerces-XML概述

Apache Xerces是Apache Software Foundation下的一个XML解析器,提供了Java和C++两种版本,分别叫做Xerces-J和Xerces-C。

特点
  • 遵循XML标准:Xerces-J/C严格遵循XML1.0(第五版)和XML Schema定义;
  • 完全可移植:Xerces-J/C支持主流操作系统(如Windows、Linux等);
  • 易于使用:Xerces-J/C提供了简单易懂的API;
  • 灵活可扩展:Xerces-J/C的架构允许灵活地添加新的工具和插件;
  • 开放源代码:Xerces-J/C遵循Apache 2.0开源协议,可以自由使用和分发。
组成
基本组件
  • SAX:Simple API for XML,提供了一种基于事件的XML解析方式;
  • DOM:Document Object Model,提供了一种基于树形结构(节点)的XML解析方式;
  • SAX2:SAX2 API for XML,是SAX的扩展,提供了更加完整的XML解析特性;
  • DOM Level 3:DOM的扩展,提供了更加完整XML文档操作的功能。
其他组件
  • XML Schema API:可以用于验证XML文件是否遵循XML Schema定义;
  • Validation API:为SAX2事件模型提供了验证的机制;
  • XPath API:XPath是一种用于根据XML文档中的节点或属性来进行遍历或者选取的语言,Xerces提供了XPath的API。
使用
Java环境
  1. 官网下载Xerces-J的jar包;
  2. 将下载的jar包加入classpath;
  3. 使用相应的API进行XML解析或Generation。
C++环境
  1. 官网下载Xerces-C的源代码;
  2. 解压源代码,进入解压后的目录;
  3. 执行./configure && make命令,编译生成静态库;
  4. 在项目中导入生成的静态库,使用相应的API进行XML解析或Generation。
示例

使用Java环境的Xerces-J解析XML文件:

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

import org.apache.xerces.parsers.DOMParser;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;

public class XmlParser {

    public static void main(String[] args) throws SAXException, IOException {
        URL xmlUrl = new URL("http://www.w3.org/TR/1998/REC-xml-19980210");
        InputStream xmlStream = xmlUrl.openStream();
        DOMParser parser = new DOMParser();
        parser.parse(xmlStream);
        Document doc = parser.getDocument();
        System.out.println(doc.getFirstChild().getNodeName());
    }
}

使用C++环境的Xerces-C解析XML文件:

#include <string>
#include <iostream>

#include <xercesc/dom/DOM.hpp>
#include <xercesc/dom/DOMTreeWalker.hpp>
#include <xercesc/dom/DOMXPathResult.hpp>
#include <xercesc/framework/LocalFileFormatTarget.hpp>
#include <xercesc/framework/MemBufInputSource.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/util/PlatformUtils.hpp>

int main(int argc, char **argv) {
    try {
        XMLPlatformUtils::Initialize();
        XercesDOMParser parser;
        parser.setValidationScheme(XercesDOMParser::Val_Never);

        parser.parse("test.xml");
        DOMDocument* doc = parser.getDocument();
        std::string xpath = "//items/item[name='product2']/price";
        XMLCh *wstr = XMLString::transcode(xpath.c_str());
        DOMXPathResult *result = doc->evaluate(wstr, doc, NULL,
            DOMXPathResult::ORDERED_NODE_SNAPSHOT_TYPE, NULL);
        std::cout << result->getNodeValue()->getFirstChild()->getNodeValue() << std::endl;
    } catch (const XMLException& e) {
        std::cerr << "Error: " << e.getMessage() << std::endl;
        return 1;
    } catch (...) {
        std::cerr << "Unexpected Error" << std::endl;
        return 1;
    }
    XMLPlatformUtils::Terminate();
    return 0;
}