- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在编写 xsd 和要验证的代码,所以我可以很好地控制这里。
我想要一个上传工具,可以根据 xml 文件向我的应用程序添加内容。应该根据 xml 文件另一部分中的值之一针对不同的模式验证 xml 文件的一部分。下面是一个例子来说明:
<foo>
<name>Harold</name>
<bar>Alpha</bar>
<baz>Mercury</baz>
<!-- ... more general info that applies to all foos ... -->
<bar-config>
<!-- the content here is specific to the bar named "Alpha" -->
</bar-config>
<baz-config>
<!-- the content here is specific to the baz named "Mercury" -->
</baz>
</foo>
在这种情况下,<bar>
的内容有一些受控词汇表。 ,我可以很好地处理那部分。然后,根据 bar 值,应该使用适当的 xml 模式来验证 bar-config 的内容。对于 baz 和 baz-config 也是如此。
执行解析/验证的代码是用 Java 编写的。不确定解决方案对语言的依赖程度如何。
理想情况下,该解决方案将允许 xml 作者声明适当的架构位置和其他内容,以便他/她可以在足够智能的编辑器中即时验证 xml。
此外,<bar>
的可能值和 <baz>
是正交的,所以我不想通过扩展每个可能的 bar/baz 组合来做到这一点。我的意思是,如果有 24 个可能的 bar 值/模式和 8 个可能的 baz 值/模式,我希望能够编写 1 + 24 + 8 = 33 个模式,而不是 1 * 24 * 8 = 192 个模式.
此外,如果可能的话,我宁愿不要将 bar-config 和 baz-config 分解成单独的 xml 文件。我意识到这可能会使所有问题变得更容易,因为每个 xml 文件都有一个单一的模式,但我正在尝试查看是否有一个好的单 xml 文件解决方案。
最佳答案
我终于明白了。
首先,在 foo 模式中,bar-config 和 baz-config 元素的类型包含一个 any
元素,如下所示:
<sequence>
<any minOccurs="0" maxOccurs="1"
processContents="lax" namespace="##any" />
</sequence>
然后,在 xml 中,您必须使用 bar-config 或 baz-config 的子元素上的 xmlns
属性指定正确的命名空间,如下所示:
<bar-config>
<config xmlns="http://www.example.org/bar/Alpha">
... config xml here ...
</config>
</bar-config>
然后,您的 bar Alpha 的 XML 架构文件将具有一个目标命名空间 http://www.example.org/bar/Alpha并将定义根元素 config
。
如果您的 XML 文件具有两个模式文件的命名空间声明和模式位置,这足以让编辑器执行所有验证(至少对 Eclipse 来说足够好)。
到目前为止,我们已经满足了 xml 作者可以在编辑器中验证的方式编写 xml 的要求。
现在,我们需要消费者能够验证。就我而言,我使用的是 Java。
如果有机会,您知道需要提前验证的模式文件,那么您只需创建一个 Schema 对象并像往常一样进行验证,如下所示:
Schema schema = factory().newSchema(new Source[] {
new StreamSource(stream("foo.xsd")),
new StreamSource(stream("Alpha.xsd")),
new StreamSource(stream("Mercury.xsd")),
});
然而,在这种情况下,在我们解析完主文档之前,我们不知道要使用哪些 xsd 文件。因此,一般程序是:
警告:看来文档必须构建为命名空间感知才能使其工作。
这是一些代码(这是从我的代码的不同地方截取的,因此复制和粘贴可能会引入一些错误):
// Contains the filename of the xml file
String filename;
// Load the xml data using a namespace-aware builder (the method
// 'stream' simply opens an input stream on a file)
Document document;
DocumentBuilderFactory docBuilderFactory =
DocumentBuilderFactory.newInstance();
docBuilderFactory.setNamespaceAware(true);
document = docBuilderFactory.newDocumentBuilder().parse(stream(filename));
// Create the schema factory
SchemaFactory sFactory = SchemaFactory.newInstance(
XMLConstants.W3C_XML_SCHEMA_NS_URI);
// Load the main schema
Schema schema = sFactory.newSchema(
new StreamSource(stream("foo.xsd")));
// Validate using main schema
schema.newValidator().validate(new DOMSource(document));
// Get the node that is the root for the portion you want to validate
// using another schema
Node node= getSpecialNode(document);
// Build a Document from that node
Document subDocument = docBuilderFactory.newDocumentBuilder().newDocument();
subDocument.appendChild(subDocument.importNode(node, true));
// Determine the schema to use using your own logic
Schema subSchema = parseAndDetermineSchema(document);
// Validate using other schema
subSchema.newValidator().validate(new DOMSource(subDocument));
关于java - 要针对多个 xsd 模式验证的 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2624763/
我知道我以前在某个地方看到过这个,但我再也找不到它了。我需要一个从另一个 xsd 中调用 xsd 文件的示例。这在生成大量 xml 文件的情况下非常有用,但在这些 xml 文件之间存在大量公共(pub
有人知道供应商中立的 XSD 来描述关系数据库模式吗?我们的系统需要获取有关数据库结构的信息: 表 列和类型 主键和外键约束 索引 等 以独立于供应商的方式并将其存储在 XML 文件中以供以后处理。
我在 XSD 中使用 gml (3.1.1) XSD 作为我的应用程序。我想下载版本 3.1.1 中的所有 gml XSD,例如 zip 文件。换句话说:基本 xsd 是 here我想用 zip 文件
我想要一个 XSD 来验证包含具有许多别名但每个别名具有不同值的文件元素的 XML。 这是我的 XML: Document1
我看到一个 xml 架构 ( EPP ) 将 xsd:choice 与一个元素一起使用,即使我们可以使用 xsd:enumeration 代替:
我目前工作的公司将架构或契约(Contract)版本编入根节点。例如, ... 我正在寻找人们对这种设计方法的意见,因为我不相信它是合理的。例如,它要求所有使用此模式作为消息传递契约的服务都能够发
我在处理 Web 服务响应时遇到了 Apache CXF 解析错误。归结为一个空元素被返回: 元素定义如下: 现在我在 CXF 邮件列表上看到了 empty value is not allowe
XSD 可以为比较两个元素添加约束吗? 假设我在 DataRangeType 下有 Begin End 我想添加一个约束说 Begin 非常
我想声明一个要包含在复杂类型声明中的元素,并且该元素有一个强制属性:“option=MyOption”,但是“选项”属性的值可以是任何值,具体取决于上下文。 也就是说:在使用包含该元素的复杂类型的任何
我需要能够将简单元素类型设置为整数,但也可以将其设置为空。如果此示例为空且空白字段不是整数,则此示例将发送错误。我该如何解决? 最佳答案 您要做的是在同一元素上分配限制,并对其进行合并,例如以下示例
对于这个 xml: 我有这个模式,它似乎可以根据 w3 schema validation service 进行验证,并且该架构可以很好地验证上述 XML。遗憾的是,xsd.exe
我有两个 XSD 文件(源文件和目标文件)...我应该在什么基础上映射这两个文件以获得 XSLT?我知道 MapForce 如何帮助映射,但我使用示例项目..现在我想知道我应该在什么基础上映射我的客户
我有一个 .cs 文件,其中包含 XTypedElement 和 IXMetaData 的子类。微软有一个 tool that generates XSD files automatically来自托
这个问题在这里已经有了答案: XML Schema to validate XML Schemas? (3 个答案) 关闭 9 年前。 是否存在可验证其他 XML 架构的 Xml 架构? 我想做的是
假设我正在处理一个 xsd:simpleType,它是一个字符串,需要具有特定的字符集和特定的最大长度,类似于以下代码: 所以我的 xsd 类型将是一个只
JAXB 同时映射 xsd:base64Binary和 xsd:hexBinary类型为 byte[] . 鉴于我有一个架构/DOM 元素代表这些类型中的每一个,例如: ABCD对于 xsd:hexB
我非常确定我在这里遗漏了一些简单的东西。 我正在使用 netbeans 在两个单独的项目中创建一个 web jax-ws web 服务和一个客户端,并且我有一些自定义绑定(bind)已使用 net b
将字节数组表示为 XSD 架构的最佳方式是什么?我有一个字节输入,我需要解析它并将其提供给 JAXB 从 XSD 模式生成的 Java 对象以供将来验证。我输入中的每条信息都由偏移量和长度定义。我想将
我的架构的这一部分给我带来了麻烦:
我需要定义元素“MyData”的名为“DataValue”的属性。但要求是“DataValue”的类型可以动态更改,即数据值在一个实例中可以是字符串,而在其他实例中它可以是 int 或 bool。它可
我是一名优秀的程序员,十分优秀!