java - 如何创建允许 Xml 元素具有冒号和节点数的 XML

标签 java xml jaxb

//我需要创建以下 XML 。我搜索了很多但无法理解如何创建这种类型的 xml:

  <CommandInfoDTO ClassName="DomainDTO">
    <Domains>
      <a:string>kochar.com</a:string>
      <a:string>yahoo.com</a:string>
    </Domains>
  </CommandInfoDTO>

//我创建了具有单个节点的 xml,所以我使用了 JaxB 和 Marshaller

@XmlRootElement(name = "CommandInfoDTO")
@XmlAccessorType(XmlAccessType.FIELD)
public class EnforcePasswordDTO {

    @XmlAttribute(name = "ClassName")
    String className = "EnforcePasswordDTO";
    @XmlElement(name = "AllowSpecialCharacters")
    boolean AllowSpecialCharacters = false;
    @XmlElement(name = "ChangeFrequency")
    String changeFrequency = null;
   }

 JAXBContext jc = JAXBContext.newInstance(EnforcePasswordDTO.class);
 Marshaller marshaller = jc.createMarshaller();

<CommandInfoDTO ClassName="EnforcePasswordDTO">
    <AllowSpecialCharacters>true</AllowSpecialCharacters>
    <ChangeFrequency>5</ChangeFrequency>
</CommandInfoDTO>

//但是我如何创建具有冒号和节点数的 xml。

最佳答案

编码 - 没问题

要编码(输出)元素名称中的冒号 (:),您只需在相应 JAXB 注释的 name 参数中指定它即可。

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Foo {

    @XmlElement(name="notANamespacePrefix:bar")
    String bar;

}

输出

<?xml version="1.0" encoding="UTF-8"?>
<foo>
    <notANamespacePrefix:bar>Hello World</notANamespacePrefix:bar>
</foo>

解码 - 需要特殊处理

什么行不通

如果您尝试解码在元素名称中包含冒号的 XML,其中冒号之前的部分不对应于命名空间前缀,如下所示:

    Unmarshaller unmarshaller = jc.createUnmarshaller();
    File xml = new File("src/forum22088353/input.xml");
    Foo uFoo = (Foo) unmarshaller.unmarshal(xml);

然后你会得到如下异常:

Exception in thread "main" javax.xml.bind.UnmarshalException
 - with linked exception:
[org.xml.sax.SAXParseException; systemId: file:/Users/bdoughan/GIT/EclipseLink-Trunk3/Scratch/src/forum22088353/input.xml; lineNumber: 3; columnNumber: 30; The prefix "notANamespacePrefix" for element "notANamespacePrefix:bar" is not bound.]
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(AbstractUnmarshallerImpl.java:335)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.createUnmarshalException(UnmarshallerImpl.java:514)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:215)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:184)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:157)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:162)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:171)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:189)
    at forum22088353.Demo.main(Demo.java:21)

什么会起作用

您可以利用带有 SAX 的 JAXB 来为带有冒号字符的过程元素名称设置属性。这是因为默认情况下 SAX 解析器不识别 namespace 。

    SAXParserFactory spf = SAXParserFactory.newInstance();
    SAXParser sp = spf.newSAXParser();
    XMLReader xmlReader = sp.getXMLReader();

    Unmarshaller unmarshaller = jc.createUnmarshaller();
    UnmarshallerHandler unmarshallerHandler = unmarshaller.getUnmarshallerHandler();
    xmlReader.setContentHandler(unmarshallerHandler);
    xmlReader.parse(new InputSource("src/forum22088353/input.xml"));
    Foo uFoo = (Foo) unmarshallerHandler.getResult();

关于java - 如何创建允许 Xml 元素具有冒号和节点数的 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22088353/

相关文章:

java - 删除 XML 结构 Java DOM 中的节点

java - 在 Jaxb 中编码 map 时出现问题

java - 在 java 中调用 System.exit() 的确切目的是什么

java - Android:FileProvider.getUriForFile "Failed to find configured root"

java - 递归方法最大深度-静态变量

java - 没有复杂类型的 Apache CXF Soap wsdl

java - Jaxb 在不使用 getter/setter 的情况下解码,而预期

java - 如何为多种屏幕尺寸设置图像 - android

java - 收到错误 : Route() in Route cannot be applied to String

java - Jni FindClass 返回 NULL