2013-05-17 38 views
8

FictionBook(也称为FB2)是一种基于XML的电子书格式。其模式可以在这里找到:为什么Visual Studio不喜欢这种XML模式? (前缀''不能映射到为“xml”或“xmlns”保留的名称空间名称)

http://gribuser.ru/xml/fictionbook/2.0/xsd/

然而,当我下载了这个方案,并试图在Visual Studio 2012中打开它,我得到了一堆错误,其中第一项是:前缀“”不能映射到为“xml”或“xmlns”保留的名称空间名称。第5行,位置118. E:\ dev \ fb2 \ FictionBook2.xsd

模式是否真的无效?如果是这样,很多软件如何使用它来验证FB2文件?有没有简单的方法来修改模式,使VS快乐?

+0

这个问题实际上与http://gribuser.ru/xml/fictionbook/2.0/xsd/FictionBookLang。 xsd。你会看到一个问题,只是试图在浏览器中显示它。 –

+0

和FYI我发现这通过尝试使用.NET Framework类复制您的问题。 'Xml.Schema.XmlSchema.Read(XmlReader.Create(“http://gribuser.ru/xml/fictionbook/2.0/xsd/FictionBookLang.xsd”),Nothing)'重现错误。 –

+0

我知道这是因为FictionBookLang.xsd,但仍然无法弄清楚如何解决它。 – thorn

回答

5

你需要做的唯一一件事就是从FictionBookLang.xsd删除xmlns="http://www.w3.org/XML/1998/namespace",因为这是唯一的罪魁祸首:

enter image description here

设定的作者很可能想确保xml:lang属性可供人们使用。这是不正确的方式,但它仍然可以在某些情况下工作。

通常这是做不同的。如果您的XSD感知的XML处理器是“聪明”,这样的进口应该做的,像这样的,即不是

<xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="FictionBookLang.xsd"/> 

它应该是:

<xs:import namespace="http://www.w3.org/XML/1998/namespace"/> 

这就是所谓的晃来晃去的外部参考; “智能”XSD处理器知道如何将位置解析到众所周知的名称空间(当然,http://www.w3.org/XML/1998/namespace就是其中之一)。

这是使用悬空导入后,该设置的样子; xml.xsd是由处理器自动添加的,它应该是here列出的副本。

enter image description here

换句话说,通常FictionBookLand.xsd甚至不应该是编译的一部分。特别是,如果您将这些XSD与其他正确引用xml:lang属性的XSD组合在一起,那么您将得到重复的属性声明错误。

无论如何,如果你只删除所描述的属性,所有变得有效;从那里,你可以建立一个示例XML - XSDs很好。我已经生成的样本是巨大的,我只发布第一对几行...

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) --> 
<FictionBook xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:genre="http://www.gribuser.ru/xml/fictionbook/2.0/genres" xmlns="http://www.gribuser.ru/xml/fictionbook/2.0"> 
    <stylesheet type="type1">stylesheet1</stylesheet> 
    <description> 
     <title-info> 
      <genre match="100">architecture</genre> 
      <author> 
       <first-name xml:lang="en">first-name1</first-name> 
       <middle-name xml:lang="en">middle-name1</middle-name> 
       <last-name xml:lang="en">last-name1</last-name> 
       <nickname xml:lang="en">nickname1</nickname> 
       <home-page>home-page1</home-page> 
       <home-page>home-page1</home-page> 
       <email>email1</email> 
       <email>email1</email> 
      </author> 
      <book-title xml:lang="en">book-title1</book-title> 
      <annotation id="ID1" xml:lang="en"> 
1

我认为这个问题可能与开始标记中的targetNamespace=http://www.gribuser.ru/xml/fictionbook/2.0"xmlns="http://www.gribuser.ru/xml/fictionbook/2.0"属性有关。运行xmllint --schema FictionBook2.xsd --auto提供了以下错误:

FictionBookLang.xsd:3: namespace error : xml namespace URI cannot be the default namespace 
="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/XML/1998/namespace" 

删除这些属性摆脱了这些错误,虽然我不能完全强制xmllint到成功生成一个示例XML文件。

+0

尝试删除'xmlns =“...”'而不是'targetNamespace =“...”''。 –

相关问题