没有为给定文档检测到语法约束(DTD或XML模式)

时间:2014-03-26 14:47:53

标签: java xml xsd xsd-validation

这是xsd文件

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
        targetNamespace="http://www.example.org/onetext"
        xmlns:tns="http://www.example.org/onetext" 
        elementFormDefault="qualified">
  <element name="edge">
    <complexType>
      <attribute name="x" type="float"></attribute>
      <attribute name="y" type="float"></attribute>
      <attribute name="height" type="float"></attribute>
      <attribute name="width" type="float"></attribute>
      <attribute name="xhref" type="string"></attribute>
      <attribute name="id" type="string"></attribute>
      <attribute name="isLocked" type="string"></attribute>
      <attribute name="rx" type="double"></attribute>
      <attribute name="ry" type="float"></attribute>
      <attribute name="rotation" type="float"></attribute>
    </complexType>
  </element>
</schema>

这是xml文件,

<?xml version="1.0" encoding="UTF-8"?>
<edge xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns="http://www.example.org/onetext"
      xmlns:web="http://www.example.org/onetext"
      xsi:schemaLocation="web_one/WebContent onetext.xsd"
      id="WebApp_ID" version="3.0">
  <image x="336" 
         y="52" 
         height="57.6" 
         width="57.6"
         xhref="/dccp_repository/dam/logo/images/accc_logo.jpg" 
         id="Image_3"
         isLocked="false" 
         rx="336" 
         ry="52" 
         rotation="0" />
</edge>

我遇到了这种问题。

  

未检测到文档的语法限制(DTD或XML架构)。

在xml文档中。

如果我更改了xml文件的根节点,如下所示

<edge xmlns="http://www.w3.org/2001/XMLSchema"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:web="web_one/WebContent/onetext.xsd"
      xsi:schemaLocation="web_one/WebContent  
                          web_one/WebContent/onetext.xsd"
      id="WebApp_ID" 
      version="3.0">

然后我遇到了这种错误

  

cvc-elt.1:无法找到元素&#39; edge&#39;的声明。

我对这个概念感到困惑。请帮忙。

2 个答案:

答案 0 :(得分:2)

您显示的架构文档在名称空间edge中声明了一个名为http://www.example.org/onetext的元素(targetNamespace元素上的schema属性的值)。到目前为止,非常好。

在您的第一个XML文档实例中,最外面的元素名为edge,它位于名称空间http://www.example.org/onetext中。这与架构文档中的声明一致。到现在为止还挺好。如果您调用XSD验证器告诉它使用您的架构文档来查找http://www.example.com/onetext命名空间中元素的声明,那么一切都应该很好,验证器应该能够验证您的文档。如果是,它会告诉您edge元素被声明为没有子元素,因此文档实例中的edge元素无效,因为它有一个名为image的子元素(在命名空间http://www.example.org/onetext)中。验证器还可以提到模式没有声明该命名空间中名为image的任何元素。当您收到这些错误消息时,您当前的问题将得到解决,您可以继续解决下一个问题,即使您的架构和XML在您定义和使用的数据格式上达成一致。

但此刻,情况并未发生。为什么不?在您的第一个XML实例中,您的最外层元素具有xsi:schemaLocation="web_one/WebContent onetext.xsd"。翻译成英文,这意味着“Hello,模式验证器。如果您正在查找名称空间web_one/WebContent中元素的模式声明,您将在位置onetext.xsd找到该命名空间的模式文档。美好的一天!“ (好吧,规范实际上并没有说出有关美好的一天的事情;这只是我的解释。)这有一些问题:

  1. 字符串web_one/WebContent不是绝对URI,因此不适合作为命名空间名称。
  2. 文档实例中的元素都在名称空间http://www.example.org/onetext中,而您的xsi:schemaLocation属性告诉模式验证程序没有关于在哪里找到该名称空间的声明。
  3. 如果验证程序实际上读取了架构文档onetext.xsd,并且如果这是您向我们展示的架构文档,则验证程序应该抱怨命名空间名称web_one/WebContent与目标命名空间不匹配架构文档。
  4. 您收到的错误消息(未检测到文档的语法约束)反映了第2点:您的验证程序未找到与您的实例文档相关的唯一命名空间的任何声明。

    更正此问题的方法是将当前xsi:schemaLocation属性值规范替换为类似xsi:schemaLocation = "http://www.example.org/onetext onetext.xsd"的内容(假设文档onetext.xsd是您向我们展示的架构文档,并且它是在与验证的文档实例相同的目录中 - 否则,使用正确配置的相对URI)。

    您的第二个XML实例文档在命名空间edge中包含http://www.w3.org/2001/XMLSchema文档。验证器不需要指向此命名空间的架构文档的指针:它是XSD命名空间,XSD验证器通常具有硬编码到其中的该命名空间的架构。所以它的错误信息不是找不到任何模式;相反,错误消息是关于在XSD名称空间中找不到名为edge的任何元素的声明。

    第二个XML实例中所做的更改似乎只对那些不了解XML命名空间或XML命名空间声明的人有用。因此,它允许我建议您真正需要做的是花一两个小时来了解命名空间如何在XML中工作以及解析器如何从文档中理解与每个元素关联的(namespace-name,local-name)对和属性。一旦你这样做,许多与XSD架构有关的事情(特别是许多错误信息)都会有些不那么神秘。

    祝你好运!

答案 1 :(得分:0)

 This is how XML look

 <element>
 <complextype name="edge">
         <height>some words here</height>
         <width>some words here</width>
  </complextype>
 </element>

 Tips: the <element> is the root and does not need a.   name.
 <complextype> is the one u can add name to which is the Child.
 The <height> does not need much styling except  you want to use  DTD for your styling