【问题标题】:How to detect required XML attributes?如何检测所需的 XML 属性?
【发布时间】:2011-08-24 18:27:35
【问题描述】:

我有一个没有定义属性的 XML 内容,像这样:

<rootElement>
   <subElement1/>
</rootElement>

我想用在 XML Schema (XSD) 中为这个 XML 定义的必需属性填充这个 XML 内容。

例如,根据 XSD subElement1 具有必需的属性 'id'。

检测这种情况并将此类属性添加到 XML 的最佳方法是什么(用于 Java 处理)? 我们需要添加所需的属性并为它们设置适当的值。

因此,例如上面的例子,我们需要以下 XML:

<rootElement>
   <subElement1 id="some-value"/>
</rootElement>

【问题讨论】:

    标签: java xml xsd xml-parsing


    【解决方案1】:

    使用 DOM 解析器。具有遍历 XML 树、访问、插入和删除节点的方法

    【讨论】:

    • 我知道。但是我如何找到所需的属性?我被监视了 SAX 解析器,但没有找到如何去做。
    • 检查这个tutorials.jenkov.com/java-xml/dom-schema-validation.html。您激活验证并使用错误处理程序...可能是一个解决方案
    • 是的,我有这个想法以防万一
    【解决方案2】:

    我建议您为此使用 JAXB。在 Internet 上搜索教程。

    进一步使用 JAXB 的步骤,

    1. 通过提供架构使用 JAXB 生成 Java 文件
    2. 将您的 XML 解组为生成的 Java 类(bean)。不要在此处进行验证或设置验证处理程序。
    3. 用适当的值填充这些类。可以使用注释查找找到required 元素。元素的 JAXB 注释看起来像 @XmlElement(name = "ElementName", required = true)。属性注释将与此类似,@XmlAttribute(required = true)
    4. 将您的 bean 编组回 XML。您可以在编组时使用 ValidationHandler 验证您的 bean。下面是示例代码sn-p,

      marshller = JAXBContext.newInstance(pkgOrClassName).createUnmarshaller();
      marshller.setSchema(getSchema(xsd)); // skip this line for unmarshaller
      marshller.setEventHandler(new ValidationHandler()); // skip this line for unmarshaller
      

    【讨论】:

    • 这可能是静态 xml 和 xsd 的好方法。但我必须在我的代码中动态安排属性
    • @Nawa:你的 xsd/schema 很可能会被修复。但是,是的,XML 可以是任何遵循该模式的文件。但我相信这会奏效。否则,请详细说明您遇到的确切问题。
    • 初始xml一般不包含属性,只有标签存在,由于缺少必需的属性,它可能在架构上无效。我想在初始 xml 中填写所有必需的属性以使其有效。
    • @Nawa:那也很好。解组时不要设置验证处理程序,仅用于编组。我希望你明白我的意思。我也在更新我的帖子。
    【解决方案3】:

    在 XML 模式定义中,即 XSD 文件中,属性默认是可选的。要使属性成为必需,您必须定义:

    <xs:attribute name="surname" type="xs:string" use="required"/>
    

    您会在W3 Schools 上找到关于 XML 和 XML 模式定义(即 XSD)的非常好的介绍。

    在 Java 中,定义 XML 模式的等价物是使用 JAXB,即包含在 Java SE 中的用于 XML 绑定的 Java API。你可以在那里定义,例如

    @XmlRootElement
    public class Person { public @XmlAttribute(required=true) String surname; }
    

    希望这可以澄清您的问题。

    【讨论】:

    • 我知道如何在 XSD 中定义必需的属性,但这不是我的任务。我只想在 XML 中插入所有必需的属性
    • 一旦你有了 JAXB 类,代表你的 XML 实体,你可以使用反射来查询所需属性的注释。
    【解决方案4】:

    我对 Cris 也有同样的想法,但我认为使用这个验证器,你不会知道你遇到错误的地方。 我认为您必须创建或扩展自己的验证器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-15
      • 2015-04-02
      • 2013-05-22
      • 1970-01-01
      • 2020-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多