RESTeasy/JAXB; <Any> тегіндегі Элементке қосылған аттар кеңістігін қалай болдырмауға болады? (JAXB ішіндегі <Элемент> тізімі)

Мен өзімнің сабақтарымды және шығарылымымды осында жеңілдететін боламын, бірақ, негізінен, немен айналысамын? 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 any;
    @XmlElement(name = "person", namespace = "main")
    protected List 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;
    }
}

(Сыныптың көрінісі іс жүзінде емес, мен оны сыртқы қателіктерсіз тексеретін нәрсені жинау үшін барынша жеңіл етіп жасауға тырысамын).

I then clone that template using linkTemplate.cloneNode(false);

Енді бұл барлық жұмыс xml қайтарады, бірақ таңқаларлық нәрсе мынада, мен қайтару xml қосымша аттар кеңістігін қоса:


linkTemplate.setAttribute («xmlns», null); - «xmlns: ns3» ат кеңістігін қоссам, мен:


Бірақ бұл xmlns = «» жою мүмкін емес сияқты. Элементті дұрыс емес түрде жасаймын ба? Немесе тағы бір нәрсе дұрыс емес пе? Мен ешқандай көмектің/түсініктемені бағалайтындай етіп, неге ол бәрін қосып жатқандығы үшін мен шығынға ұшырамаймын.

Өңдеу: Мен элементті құрастыру үшін пайдаланатын құжаттың аттар кеңістігіне байланысты болуы керек деп ойлаймын, бірақ оны қалай түзетуге болатынына сенімді емеспін. Құжаттағы (XML) targetNamespace параметрін орнатудың кез келген тәсілі бар ма?

Редакция 2: Мен ешкімге пайдалы ештеңе қоспағанына сенімді емеспін, бірақ көп тәжірибе арқылы linkTemplate.setAttribute («xmlns:» + anything, null); xmlns: [anything] = «» сілтемесі арқылы және басқаша жасалуы мүмкін кез келген басқа құжаттарды алып тастаңыз.

Өңдеу 3: JAXB нысандарын жасау үшін пайдаланылатын xsd-дың тиісті биттері:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>



    
        
        
    
    [attributes]

[other types etc.]
6

4 жауаптар

ATOM_LINK = «сілтеме» мәні бар ма? егер болса, ол «atom: link» болуы керек және setPrefix() қоңырауын алып тастаңыз.

0
қосылды
жаңартылған кодты жібере аласыз ба?
қосылды автор jtahlborn, көзі
атрибуттарды қалай қосасыз?
қосылды автор jtahlborn, көзі
Жоқ, мен басқа атрибуттарды білдіремін (href, rel)?
қосылды автор jtahlborn, көзі
Иә ол сондай. Мен сұрақты жазғаннан кейін, бірақ нәтиже өкінішке орай бірдей екенін түсіндім. : \
қосылды автор Thor84no, көзі
Eh. Бұл жай ғана. ATOM_LINK енді «atom: link» және setPrefix жоғалып кетті. Мен сондай-ақ, түбір элемент құруды және осы элементтің баласы болуға тырыстым, бірақ ештеңе жасамады, сондықтан оны қайтадан алып тастадым.
қосылды автор Thor84no, көзі
linkTemplate.setAttribute («xmlns», null); және т.б. Мен бұл үлгіні клондалғаннан кейін ғана.
қосылды автор Thor84no, көзі
Тағы да дәл осылай, тек «xmlns» дегенді «href»/«rel» және «xml» жолдарымен нөлге ауыстырыңыз.
қосылды автор Thor84no, көзі

Мәселе мынада, сізде 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 атрибутын манипуляциялауды тапсаңыз, онда кейбіреулер дұрыс емес.

0
қосылды
Hmm. Неліктен ат префиксі есім кеңістігі туралы декларацияға байланысты емес? Бұл құжат қандай көрінеді?
қосылды автор forty-two, көзі
Сілтеме элементін жасау үшін қолданылатын құжат (Edit1: сіздің сұрағыңызда)
қосылды автор forty-two, көзі
Ұсынысқа рахмет, бірақ, өкінішке орай, нәтиже бірдей.
қосылды автор Thor84no, көзі
Мен сіздің сұрағыңыздың не екенін толық түсінетініне сенімді емеспін. Сіз қандай құжатты көргіңіз келеді?
қосылды автор Thor84no, көзі
Жарайды ма. Мен осы мәселедегі қысқартылған нұсқасын қостым.
қосылды автор Thor84no, көзі

Осы жерде ешқандай ұсыныс маған жұмыс істемегендіктен, мен басқа жолға баруды шештім. Соңында тыңдаушыны қайта жазуды аяқтадым RESTEasy Маршаллерге өзімнің тыңдаушыммен қосады. Бұл тыңдаушы RESTServiceDiscovery өрісінде сілтемелерді қолмен қоспас бұрын RESTEasy тыңдаушысын (ол болған кезде) шақырады (бұл өрісті көрсету арқылы көрсету керек және нысанды алуға дейін field.setAccessible (шын) қатынасуды тексеруді өшіру керек) .

0
қосылды

Сіздің элементіңіздіFormDefault-ды «Unqualified» -ге орнатуға тырыстық ба?

0
қосылды
Ұсынысқа рахмет, бірақ, өкінішке орай, ол жұмыс істемеді.
қосылды автор Thor84no, көзі