从XSD生成XML文件会在根节点上导致不需要的前缀

时间:2011-07-06 22:28:46

标签: xml xsd xml-namespaces xmlspy

我正在使用XML spy从XSD自动生成XML文件。但是,它似乎总是在我的根元素前面加上n1:或n2:例如它会产生类似于跟随

的东西
<?xml version="1.0"?>
<n2:EmployeeData>
   <Employee>
     <name>xyz</name>
     <dateOfBirth>10.10.10</dateOfBirth>
     <email>a@a.com</email>
   </Employee>
</n2:EmployeeData>

我希望它生成以下内容:

<?xml version="1.0"?>
<EmployeeData>
   <Employee>
     <name>xyz</name>
     <dateOfBirth>10.10.10</dateOfBirth>
     <email>a@a.com</email>
   </Employee>
</EmployeeData>

2 个答案:

答案 0 :(得分:2)

这类似于Java JAXB中没有设置NamespacePrefixMapper。如果声明名称空间uri和prefix,则将使用正确的前缀(或无前缀)和名称空间uri生成XML。签入XML Spy有一个用于设置命名空间前缀的选项。

答案 1 :(得分:0)

首先:名称空间是XML中的基本概念。如果您不熟悉名称空间,请花些时间来学习和理解它们。即使名称空间是URI,它们也不需要(但可以)指向任何现有的网页。它们只是唯一的标识符。

由于XML Schema具有目标命名空间,因此实例文档的根元素必须位于该命名空间中。如果需要,可以在实例文档中使用其他名称空间前缀,只需确保您还具有将前缀绑定到所需目标名称空间URI的名称空间定义。就像@skaffman评论的那样,您发布的XML实际上并不是格式正确的,因为它使用了名称空间前缀而没有前缀到名称空间的映射。处理问题的另一种方法是删除前缀并在根元素中定义默认命名空间。如果您的实例文档不在任何命名空间中,那么您的架构不正确,应该通过删除targetNamespace属性来修复它。

顺便说一句,在您的文档中,只有根元素属于命名空间。这不是一种常见的做法,我想在这种情况下,这种结果是由架构文档中的无意识功能引起的。默认情况下,只有在架构文档中全局声明的元素才会位于目标命名空间中。可以通过在elementFormDefault="qualified"元素上设置<xs:schema>属性来更改此设置。此属性确保在此模式中本地声明的元素也属于目标名称空间。该属性的默认值为false,如果缺少该属性,则应用该值。