我将在这里尽我所能简化我的类和输出,但基本上我想要添加一个org.w3c.dom.Element
(在本例中代表原子链接)到我返回的 JAXB 对象。 JAXB 类看起来像:
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;
import org.w3c.dom.Element;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "People", namespace = "main", propOrder = {
"any",
"persons"
})
public class People {
@XmlAnyElement
protected List<Element> any;
@XmlElement(name = "person", namespace = "main")
protected List<Person> persons;
[...]
}
我正在使用我创建的模板创建元素,如下所示:
import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;
public class ElementGen {
public Element getTemplate() throws DOMException, SAXException, ParserConfigurationException {
final SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
final Schema schema = sf.newSchema(new StreamSource(
Thread.currentThread().getContextClassLoader().getResourceAsStream(ATOM_XSD)));
final DocumentBuilderFactory docBuilder = DocumentBuilderFactory.newInstance();
docBuilder.setSchema(schema);
final Document doc = docBuilder.newDocumentBuilder().newDocument();
linkTemplate = doc.createElementNS(ATOM_NAMESPACE, ATOM_LINK);
return linkTemplate;
}
}
(这实际上并不是类的样子,我只是想让它尽可能容易地编译一些东西来测试它,而不会有所有外部混乱)。
然后我使用克隆该模板linkTemplate.cloneNode(false);
现在这一切都有效,因为它返回 xml,但奇怪的是我返回的 xml 附加了额外的命名空间:
<atom:link xmlns:ns3="main" xmlns="" href="href" rel="rel"/>
如果我添加linkTemplate.setAttribute("xmlns", null);
“xmlns:ns3”命名空间消失,我得到:
<atom:link xmlns="" href="href" rel="rel"/>
但似乎没有办法删除 xmlns=""。我是否以错误的方式创建了元素?或者也许还有其他问题?我很不知道为什么要添加这些,所以任何帮助/解释将不胜感激。
编辑:我相信它一定与我用于生成元素的文档的命名空间有关,但我不确定如何修复它。有没有办法在文档上设置(XML)targetNamespace?
编辑2:我不确定它是否为任何人添加了任何有用的东西,但通过更多的实验我发现linkTemplate.setAttribute("xmlns:" + anything, null);
具有创建链接的效果xmlns:[anything]=""
并删除否则会生成的任何其他内容。
编辑 3:用于生成 JAXB 对象的 xsd 的相关位是:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0"
xmlns="main"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:atom="http://www.w3.org/2005/Atom"
targetNamespace="main"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:complexType name="People">
<xs:sequence>
<xs:any namespace="##other" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="person" type="Person" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
[attributes]
</xs:complexType>
[other types etc.]