当前位置: 首页 > 知识库问答 >
问题:

使用DOM和SAX解析器对xsd进行xml验证

葛承教
2023-03-14

我正在用XSD验证xml文档。通过使用sax解析器,它成功地验证了。但是当我们使用DOM解析器时,它给出的错误是“Validator class:com.sun.org.apache.xerces.internal.jaxp.validation.validatorImpl

org.xml.sax.SAXParseException;CVC-ELT.1:找不到元素“diagram”的声明。“

null

**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">

null

编辑:

简化的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);

共有1个答案

陈哲
2023-03-14

您的targetNamespace定义不寻常(它本身看起来就像一个前缀声明)。此外,它还使用了“保留的”xsi前缀,这通常由“XML模式实例”使用。

也许DOM验证被这个“假的”xmlns:xsi前缀欺骗了,您是否可以尝试使用xmlns:xsi以外的另一个名称空间值来查看是否有不同的结果?

编辑

经过一些搜索,这是因为创建的DOM不是名称空间感知的。要修复它,您只需将documentBuilder设置为名称空间感知的:

factory.setNamespaceAware(true);

这是在解决我的问题。

 类似资料:
  • 使用JDK6将XML文件加载到DOM中。必须根据XSD验证XML文件。XSD文件位置因运行环境而异。无论目录结构如何,都需要一个目录解析器,以确保可以根据XSD验证XML。一旦XML被验证,就可以对其进行转换。 我的理解是,DocumentBuilderFactory可以用来配置这样的验证。这是通过使用带有XMLCatalogResolver的DocumentBuilder查找与XML文件关联的X

  • 我正在使用Delphi10.2更新3。我按照这些说明验证生成的xml文档。 属性noNamespaceSchema位置对XML解析有什么影响? 使用Windows DOM和TXMLDocument验证XML:在某些计算机上不起作用 delphi中msxml的模式验证 但我有一个错误。“DTD/架构中未定义元素‘jegyzek\u adatok’上的属性‘noNamespaceSchemaLocat

  • 我是XSD新手,不知道为什么我的XSD没有进行验证。我收到以下错误: s4s-elt-无效-内容.1:“参数信息”的内容无效。元素“复杂类型”无效、放错位置或出现过于频繁。 cvc复合型。2.4。d: 发现以元素“exception”开头的无效内容。此时不需要任何子元素。 XML: XSD: 我错过了什么吗?我想通过使用复杂类型并引用它们来分解它,从而使其更容易...

  • 问题内容: 它很好用,但是我希望它返回一个包含所有字符串的数组,而不是最后一个元素返回一个字符串。 任何想法如何做到这一点? 问题答案: 因此,你想构建一个XML解析器来解析这样的RSS feed。 现在,你可以使用两个SAX实现。你可以使用org.xml.sax或android.sax实现。在发布简短的示例后,我将解释两者的优点和缺点。 android.sax Implementation 让我

  • 问题内容: 它很好用,但是我希望它返回一个包含所有字符串的数组,而不是最后一个元素返回一个字符串。 任何想法如何做到这一点? 问题答案: 因此,你想构建一个XML解析器来解析这样的RSS feed。 现在,你可以使用两个SAX实现。你可以使用org.xml.sax或android.sax实现。在发布简短的示例后,我将解释两者的优点和缺点。 android.sax实现 让我们从实现开始。 你首先必须

  • 问题内容: 我有一个XML文件,我需要在其中搜索特定的标签并更新其值。问题在于,使用Sax解析器是“必须的”。我必须通过“仅”使用Sax解析器来找到这些标签,dom stax j4dom dom4j解析器不在考虑范围之内。 我可以通过将xml文件转换为字符串并使用sax解析器对其进行解析并按对象附加新值来完成此任务吗?可以吗 或您会推荐什么? 问题答案: 这是一个有效的代码,只需添加缺少的导入。它