`
allenwei
  • 浏览: 87699 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

用dom4解析XML并校验schema

阅读更多

解析并不难,schema校验比较麻烦,以下是全部代码

 private Document readXmlFromFile(File file) {
      Document protocolDoc = null;
      SAXReader reader = new SAXReader();
      XMLErrorHandler errorHandler = new XMLErrorHandler();
      SAXParserFactory factory = SAXParserFactory.newInstance();
      System.out.println(file.getAbsolutePath());
      factory.setValidating(true); // 要加入校验一定要写这句
      factory.setNamespaceAware(true);
      try {
         //先读取xml文件,再验证
         protocolDoc = reader.read(file);
         SAXParser parser = factory.newSAXParser();

         parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
               "http://www.w3.org/2001/XMLSchema");
         parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource", "file:"
               + this.getClass().getResource("/").getPath().toString() + PROTOCOL_XSD_FILE_NAME);

         SAXValidator validator = new SAXValidator(parser.getXMLReader());

         validator.setErrorHandler(errorHandler);

         validator.validate(protocolDoc);

         XMLWriter writer = new XMLWriter(OutputFormat.createPrettyPrint());

         //如果出错errorHandler会记录所有错误信息
         if (errorHandler.getErrors().hasContent()) {
            System.out.println("faild");
            //利用 dom4j 提供的 XMLWriter 打印出所有错误信息
            writer.write(errorHandler.getErrors());
            logger.error("validate xml schema on File " + file.getAbsolutePath() + " fail.");
            throw new ParseProtocolException("validate xml schema on File " + file.getAbsolutePath() + " fail.");
         }
      } catch (ParserConfigurationException e) {
         logger.error("Read xml From File " + file.getAbsolutePath() + " occur ParserConfigurationException.", e);
         throw new ParseProtocolException("Read xml From File " + file.getAbsolutePath()
               + " occur ParserConfigurationException.", e);
      } catch (SAXException e) {
         logger.error("Read xml From File " + file.getAbsolutePath() + " occur SAXException.", e);
         throw new ParseProtocolException("Read xml From File " + file.getAbsolutePath() + " occur SAXException.", e);
      } catch (UnsupportedEncodingException e) {
         logger.error("Read xml From File " + file.getAbsolutePath() + " occur UnsupportedEncodingException.", e);
         throw new ParseProtocolException("Read xml From File " + file.getAbsolutePath()
               + " occur UnsupportedEncodingException.", e);
      } catch (IOException e) {
         logger.error("Read xml From File " + file.getAbsolutePath() + " occur IOException.", e);
         throw new ParseProtocolException("Read xml From File " + file.getAbsolutePath() + " occur IOException.", e);
      } catch (DocumentException e) {
         logger.error("Read xml From File " + file.getAbsolutePath() + " occur DocumentException.", e);
         throw new ParseProtocolException("Read xml From File " + file.getAbsolutePath() + " occur DocumentException.",
               e);
      }
      return protocolDoc;
   }


      //以下是解析过程
      Document protocolDoc = readXmlFromFile(file);

      //得到根节点
      Element openremoteElement = protocolDoc.getRootElement();
      //遍历下面的子结点
      Iterator<Element> protocolItr = openremoteElement.elementIterator(PROTOCOL_ELEMENT_NAME);
      while (protocolItr.hasNext()) {
         Element protocolElement = protocolItr.next();
         ProtocolDefinition protocolDefinition = new ProtocolDefinition();
         // set protocol name
         // 获取节点中的属性
         protocolDefinition.setName(protocolElement.attributeValue(NAME_ATTR_NAME));

         // parse attr element start
         protocolDefinition.getAttrs().addAll(parseAttributs(protocolElement));
         map.put(protocolDefinition.getName(), protocolDefinition);
      }
      return map;
0
0
分享到:
评论

相关推荐

    Java通过XML Schema校验XML

    ava校验XML是件很扯淡的事情,... 下面不扯这些废话了,我用DOM4j结合javaxml api使用XSD来校验一个xml有效性,下面这个例子虽然和蹩脚,但是也费了一番功夫,放出来大家研究吧,有更好的实现也希望能和我一同分享。

    day023-xml解析笔记和代码.rar

    由于DOM4J在解析XML时只能一层一层解析,所以当XML文件层数过多时使用会很不方便, 结合XPATH就可以直接获取到某个元素 使用dom4j支持xpath的操作的几种主要形式 第一种形式 /a/b/c: 表示一层...

    tinyxml+tinyxpath组合编程套件,很好的编程工具,都是源码

    因此,解析器也分为两种,一种是验证的,即会跟据XML文件中的声明,用相应的DTD文件对XML文件进行校验,检查它是否满足DTD文件的要求。另一种是忽略DTD文件,只要基本格式正确,就可以进行解析。 就我所知,验证的...

    ISO-IEC-19776-1.2-X3DEncodings-XML

    X3D是一种专为万维网而设计... X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。所传为其通用技术规范的一个。英文。

    ISO-IEC-19775-1.2-X3D-AbstractSpecification

    X3D是一种专为万维网而设计的三... X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。所发为其通用规范中的一个。英文

    ISO-IEC-19776-X3DEncodings-All-Edition-1

    X3D是一种专为万维网而设计... X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。所传为其通用技术规范的一个。英文。

    ISO-IEC-19777-X3DLanguageBindings

    X3D是一种专为万维网而设计... X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。所传为其通用技术规范的一个。英文。

    ISO-IEC-19777-2-X3DLanguageBindings-Java

    X3D是一种专为万维网而设计... X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。所传为其通用技术规范的一个。英文。

    ISO-IEC-19776-3-X3DEncodings-CompressedBinary

    X3D是一种专为万维网而设计... X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。所传为其通用技术规范的一个。英文。

    ISO-IEC-19777-1-X3DLanguageBindings-ECMAScript

    X3D是一种专为万维网而设计... X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。所传为其通用技术规范的一个。英文。

    ISO-IEC-FDIS-19775-2.2-X3D-SceneAccessInterface

    X3D是一种专为万维网而设计... X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。所传为其通用技术规范的一个。英文。

    ISO-IEC-19776-2.2-X3DEncodings-ClassicVRML

    X3D是一种专为万维网而设计... X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。所传为其通用技术规范的一个。英文。

    ISO-IEC-FCD-19776-3.2-X3DEncodings-CompressedBinary

    X3D是一种专为万维网而设计... X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。所传为其通用技术规范的一个。英文。

    J2EE(Java EE)技术总结-J2EE学习精华教程-电子书

    .....XML_Schema(文档描述与校验技术之一) .....XML_DOM(文档编程接口之一) .....XML_SAX(文档编程接口之一) .....EJB体系结构 .....会话与消息驱动Bean .....AJAX .....JAXB .....Mail(邮件) .....Security(加密...

    超级有影响力霸气的Java面试题大全文档

    Stateless Session Bean 虽然也是逻辑组件,但是他却不负责记录使用者状态,也就是说当使用者呼叫 Stateless Session Bean 的时候,EJB Container 并不会找寻特定的 Stateless Session Bean 的实体来执行这个 method...

    java 面试题 总结

    Stateless Session Bean 虽然也是逻辑组件,但是他却不负责记录使用者状态,也就是说当使用者呼叫 Stateless Session Bean 的时候,EJB Container 并不会找寻特定的 Stateless Session Bean 的实体来执行这个 method...

Global site tag (gtag.js) - Google Analytics