java - 在 Java 中,我如何解析 xml 模式 (xsd) 以了解给定元素的有效内容?

标签 java xsd

我希望能够读取 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-belement-c ...或者必须有 child element-belement-c ...或者每个都必须有一个...我希望您能得到照片。

我查看了 XSOM、Eclipse XSD、Apache XmlSchema 等许多库,发现它们都缺少好的示例代码。我在网上搜索也没有成功。

有没有人知道一个很好的例子或者一本书来演示如何遍历 XML 模式并找出在经过验证的 XML 文档中给定点的有效选项?

澄清

我不是要验证文档,而是想知道给定点的选项以帮助创建或编辑文档。如果我在文档中知道“我在这里”,我想确定此时我可以做什么。 “插入元素 A、B 或 C 之一”或“附加属性‘描述’”。

最佳答案

这是个好问题。虽然它很旧,但我没有找到可以接受的答案。问题是我所知道的现有库( XSOMApache 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/

相关文章:

xml - 我怎样才能重复使用相同的 <xs :choice> in different complex type definitions?

java - 如何检查jsp文件是否包含在另一个jsp文件中?

database - 在 Java 中从数据库表生成 XML 模式

java - 模型转换为平台特定 (NC) 代码

java - 如何将asm库添加到java项目中?

java - 我的 XML 模式有什么问题?

java - 找不到元素 'beans' 的声明。

java并行流使用同一个worker

java - Tomcat 5 和 Tomcat 7 的 ServletContext 中的不同资源评估

java - 仅使用一种方法使用 fastSort 对整数 vector 进行排序(无需 Medianof3 或分区方法,如经典实现)