我希望能够读取 XML 架构(即 xsd),并在浏览它时从中知道什么是有效属性、子元素和值。
例如,假设我有一个 xsd,此 xml 将根据该 xsd 进行验证:
<root>
<element-a type="something">
<element-b>blah</element-b>
<element-c>blahblah</element-c>
</element-a>
</root>
我修改了几个库,我可以自信地得到 <root>
作为根元素。除此之外,我迷路了。
给定一个元素,我需要知道需要或允许哪些子元素、属性、方面、选择等。使用上面的示例,我想知道 element-a
有一个属性 type
并可能有 child element-b
和 element-c
...或者必须有 child element-b
和 element-c
...或者每个都必须有一个...我希望您能得到照片。
我查看了 XSOM、Eclipse XSD、Apache XmlSchema 等许多库,发现它们都缺少好的示例代码。我在网上搜索也没有成功。
有没有人知道一个很好的例子或者一本书来演示如何遍历 XML 模式并找出在经过验证的 XML 文档中给定点的有效选项?
澄清
我不是要验证文档,而是想知道给定点的选项以帮助创建或编辑文档。如果我在文档中知道“我在这里”,我想确定此时我可以做什么。 “插入元素 A、B 或 C 之一”或“附加属性‘描述’”。
最佳答案
这是个好问题。虽然它很旧,但我没有找到可以接受的答案。问题是我所知道的现有库( XSOM , Apache XmlSchema )被设计为对象模型。实现者无意提供任何实用方法——您应该考虑使用提供的对象模型自己实现它们。
让我们看看如何通过 Apache XmlSchema 查询特定于上下文的元素。
您可以使用他们的 tutorial作为起点。此外,Apache CFX 框架提供了 XmlSchemaUtils类有很多方便的代码示例。
首先,阅读库教程中说明的XmlSchemaCollection
:
XmlSchemaCollection xmlSchemaCollection = new XmlSchemaCollection();
xmlSchemaCollection.read(inputSource, new ValidationEventHandler());
现在,XML Schema 定义了两种数据类型:
- 简单类型
- 复杂类型
简单类型由 XmlSchemaSimpleType
类表示。处理它们很容易。阅读文档:https://ws.apache.org/commons/XmlSchema/apidocs/org/apache/ws/commons/schema/XmlSchemaSimpleType.html .但是让我们看看如何处理复杂类型。让我们从一个简单的方法开始:
@Override
public List<QName> getChildElementNames(QName parentElementName) {
XmlSchemaElement element = xmlSchemaCollection.getElementByQName(parentElementName);
XmlSchemaType type = element != null ? element.getSchemaType() : null;
List<QName> result = new LinkedList<>();
if (type instanceof XmlSchemaComplexType) {
addElementNames(result, (XmlSchemaComplexType) type);
}
return result;
}
XmlSchemaComplexType
可以代表真实类型和 extension
元素。请参阅 XmlSchemaUtils
类的 public static QName getBaseType(XmlSchemaComplexType type)
方法。
private void addElementNames(List<QName> result, XmlSchemaComplexType type) {
XmlSchemaComplexType baseType = getBaseType(type);
XmlSchemaParticle particle = baseType != null ? baseType.getParticle() : type.getParticle();
addElementNames(result, particle);
}
当您处理 XmlSchemaParticle
时,请考虑它可以有多个实现。请参阅:https://ws.apache.org/commons/XmlSchema/apidocs/org/apache/ws/commons/schema/XmlSchemaParticle.html
private void addElementNames(List<QName> result, XmlSchemaParticle particle) {
if (particle instanceof XmlSchemaAny) {
} else if (particle instanceof XmlSchemaElement) {
} else if (particle instanceof XmlSchemaGroupBase) {
} else if (particle instanceof XmlSchemaGroupRef) {
}
}
要记住的另一件事是元素可以是抽象的也可以是具体的。同样,JavaDocs 是最好的指南。
关于java - 在 Java 中,我如何解析 xml 模式 (xsd) 以了解给定元素的有效内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8282578/