Jaxb: локальное пространство имен через атрибут xmlns вместо префикса элемента?

#java #xml #jaxb

#java #xml #jaxb

Вопрос:

Я генерирую некоторый XML с помощью Jaxb, который выглядит довольно хорошо. Вот снипит:

 <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<ns2:oval_system_characteristics xsi:schemaLocation="http://oval.mitre.org/XMLSchema/oval-system-characteristics-5 oval-system-characteristics-schema.xsd http://oval.mitre.org/XMLSchema/oval-common-5 oval-common-schema.xsd http://oval.mitre.org/XMLSchema/oval-system-characteristics-5#esx esx-system-characteristics-schema.xsd" 
xmlns:ns2="http://oval.mitre.org/XMLSchema/oval-system-characteristics-5" xmlns="http://oval.mitre.org/XMLSchema/oval-common-5" xmlns:ns3="http://oval.mitre.org/XMLSchema/oval-system-characteristics-5#esx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  

 <ns3:visdkmanagedobject_item id="1">
    <ns3:property>isolation.tools.diskWiper.disable</ns3:property>
    <ns3:value datatype="boolean">true</ns3:value>
</ns3:visdkmanagedobject_item>
  

Это XML, соответствующий стандартам. К сожалению, я ограничен ограничениями нижестоящей системы, она принимает только XML, отформатированный таким образом:

 <visdkmanagedobject_item id="1" xmlns="http://oval.mitre.org/XMLSchema/oval-system-characteristics-5#esx">
    <property>isolation.tools.diskWiper.disable</property>
    <value datatype="boolean">true</value>
</visdkmanagedobject_item>
  

Где определенные элементы имеют пространство имен через атрибут xmlns.
Теперь вопрос: как мне заставить Jaxb прекратить (делать правильные вещи) пространство имен элементов с префиксом и начать пространство имен элементов с атрибутом xmlns?

Ответ №1:

Вы можете настроить пространство имен по умолчанию, используя @XmlSchema аннотацию на уровне пакета. Это делается путем использования package-info класса (пример ниже):

com.example.package-info

 @XmlSchema(
    namespace = "http://oval.mitre.org/XMLSchema/oval-system-characteristics-5#esx",
    elementFormDefault = XmlNsForm.QUALIFIED)
package com.example;

import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;
  

Для получения дополнительной информации

Ответ №2:

есть несколько способов решить эту проблему. это может быть так просто, или вам может потребоваться полностью контролировать префиксы пространства имен. (кстати, этот второй xml не является «неправильным», он просто использует пространство имен по умолчанию. однако было бы неверно, если бы система требовала определенного префикса для xml).