簡體   English   中英

RestEasy的/ JAXB;如何避免將命名空間添加到<any>標記中的元素? (在JAXB中列出<Element>)

[英]RESTeasy/JAXB; How do I avoid a namespace being added to an Element in an <any> tag? (List<Element> in JAXB)

我將盡可能地簡化我的類和輸出,但基本上我想要的是我想在一個JAXB對象中添加一個org.w3c.dom.Element (在這種情況下表示一個原子鏈接)回來了。 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);克隆該模板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 =“”。 我是以錯誤的方式創建元素嗎? 或者其他可能出錯的地方? 我完全不知道為什么它會添加這些,所以任何幫助/解釋都會受到贊賞。

編輯:我認為它必須與我用於生成Element的文檔的命名空間相關,但我不確定如何修復它。 有沒有辦法在文檔上設置(XML)targetNamespace?

編輯2:我不確定它是否添加了對任何人有用的東西,但是通過更多的實驗,我發現了linkTemplate.setAttribute("xmlns:" + anything, null); 具有創建與xmlns:[anything]=""的鏈接的效果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.]

是ATOM_LINK =“鏈接”的價值? 如果是這樣,它應該是“atom:link”,並刪除setPrefix()調用。

我相信問題是您創建的DocumentBuilderFactory應該是名稱空間感知。

public class ElementGen {
   public Element getTemplate() throws DOMException, SAXException, ParserConfigurationException {
    final DocumentBuilderFactory docBuilder = DocumentBuilderFactory.newInstance();
    docBuilder.setNamespaceware(true);
    final Document doc = docBuilder.newDocumentBuilder().newDocument();
    linkTemplate = doc.createElementNS(ATOM_NAMESPACE, ATOM_LINK);
    return linkTemplate;
  }
}

如果你發現自己直接操縱xmlns屬性,那么somethibng是錯誤的。

您是否嘗試將elementFormDefault設置為“UNqualified”?

由於這里沒有任何建議對我有用,我決定采用不同的方式。 最后,我最終覆蓋了監聽器RESTEasy使用我自己的監聽器添加到Marshaller。 然后,此偵聽器調用RESTEasy偵聽器(如果存在),然后在RESTServiceDiscovery字段上手動添加鏈接(您必須使用反射獲取此字段,並在獲取對象之前關閉使用field.setAccessible(true)的訪問檢查) 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM