9

FictionBook(也称为 FB2)是一种基于 XML 格式的电子书。它的架构可以在这里找到:

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

但是,当我下载此架构并尝试在 Visual Studio 2012 中打开它时,我遇到了一堆错误,其中第一个是:前缀 '' 无法映射到为“xml”或“xmlns”保留的命名空间名称。第 5 行,位置 118。 E:\dev\fb2\FictionBook2.xsd

架构真的无效吗?如果是这样,很多软件怎么可能使用它来验证 FB2 文件?有没有一种简单的方法可以修改架构以使 VS 满意?

4

2 回答 2

5

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

在此处输入图像描述

该集合的作者很可能希望确保 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 是由处理器自动添加的,它应该是此处列出的副本的副本。

在此处输入图像描述

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

无论如何,如果您仅删除所描述的属性,则一切都有效;从那里,您可以构建一个示例 XML - XSD 否则很好。我生成的样本很大,我只发布前几行......

<?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">
于 2013-05-22T18:25:17.270 回答
2

我认为问题可能出在开始标签中的targetNamespace=http://www.gribuser.ru/xml/fictionbook/2.0"and属性上。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 文件。

于 2013-05-19T23:02:31.673 回答