【问题标题】:xml validation against xsd with DOM and SAX parser使用 DOM 和 SAX 解析器对 xsd 进行 xml 验证
【发布时间】:2015-06-28 04:02:44
【问题描述】:

我正在使用 xsd 验证 xml 文档。通过使用 sax 解析器,它成功验证。但是当我们使用 DOM 解析器时,它会给出错误 " 验证器类:com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl

org.xml.sax.SAXParseException; cvc-elt.1:找不到元素“图表”的声明。”

**XSD File**
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="xmlns:xsi" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="diagram">
    <xs:complexType>
      <xs:sequence>
        ----
        ----
        ----
        
        **XML File**
        <?xml version="1.0" encoding="UTF-8"?>
<diagram xmlns="xmlns:xsi">
	<class name="Customer">

编辑:

简化的 XSD (schema1.xsd)

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="xmlns:xsi" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="diagram">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="class" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

简化的 XML (xml1.xml):

<diagram xmlns="xmlns:xsi">
    <class>classe</class>
</diagram>

重现的最少代码:

// load document
// Get Document Builder
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();

// Build Document
Document doc = builder.parse(new File("./resources/xml1.xml"));

SchemaFactory aSF = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = aSF.newSchema(new File("schema1.xsd"));
Validator validator = schema.newValidator();

Source dsource = new DOMSource(doc);
validator.validate(dsource);

【问题讨论】:

  • 向我们展示您如何调用验证。

标签: xml xsd


【解决方案1】:

您的 targetNamespace 定义不寻常(它看起来像一个前缀 声明本身)。此外,它使用“保留”xsi 前缀 通常由“Xml Schema Instance”使用。

也许 DOM 验证被这个“假”xmlns:xsi 欺骗了 前缀不知何故,你可以尝试使用另一个命名空间值而不是 xmlns:xsi 看看有没有不同的结果?

编辑

经过一番搜索,是因为DOM created is not namespace-aware。要修复它,您只需将 documentBuilder 设置为命名空间感知:

factory.setNamespaceAware(true);

这解决了我的问题。

【讨论】:

  • 我已经更改了目标名称空间,但问题就是这样。没有验证,同样的错误。
  • 如 42 条评论中所述,您能展示调用 DOM 验证的代码吗?你能用极简的 xsd 和 xml 版本重现这个问题吗(比如内部序列中只有图表元素和一个子元素)?
  • 验证器验证器 = schema.newValidator(); System.out.println(); System.out.println("验证器类:" + validator.getClass().getName()); // 根据模式验证文档 validator.validate(new DOMSource(document)); System.out.println(); System.out.println("验证通过。");
  • 尝试 { 字符串语言 = XMLConstants.W3C_XML_SCHEMA_NS_URI; SchemaFactory 工厂 = SchemaFactory.newInstance(language);架构 = factory.newSchema(新文件(名称)); } catch (Exception e) { System.out.println(e.toString()); } 返回架构;
  • 尝试 { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); document = builder.parse(new File(name)); } catch (Exception e) { System.out.println(e.toString()); } 返回文件;
猜你喜欢
  • 2013-05-26
  • 1970-01-01
  • 2015-01-01
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
相关资源
最近更新 更多