jaxb -problem z generowaniem xmla

Odpowiedz Nowy wątek
2011-10-05 10:53
0

Witam,
generuję sobie plik xml za pomocą javax.xml.bind.Marshaller
kod do generowania wygląda tak:


        javax.xml.bind.Marshaller marshaller = jaxbCtx.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
        marshaller.setProperty(javax.xml.bind.Marshaller.JAXB_FORMATTED_OUTPUT,
                Boolean.TRUE);
        marshaller.marshal(wejscie, out);

Problem w tym, że w wyniku powstają mi pliki wyglądające tak:

<?xml version="1.0" encoding="UTF-8"?>
<Nazwa1 xmlns:prefix="http://www.mynamespace/prefix">
   <Nazwa2 ID="1" version="1.0">
      <Nazwa3 ID="1">
         <Nazwa>123</Nazwa>
         <Nazwa4>321</Nazwa4>
      </Nazwa3>
      </Nazwa2>
      </Nazwa1> 

a chciałbym wygenerować coś takiego:

<?xml version="1.0" encoding="UTF-8"?>
<prefix:Nazwa1 xmlns:prefix="http://www.mynamespace/prefix">
   <prefix:Nazwa2 ID="1" version="1.0">
      <prefix:Nazwa3 ID="1">
         <prefix:Nazwa>123</prefix:Nazwa>
         <prefix:Nazwa4>321</prefix:Nazwa4>
      </prefix:Nazwa3>
    </prefix:Nazwa2>
</prefix:Nazwa1> 

Jak zmusić marshallera do dodania prefixów?
Usiłowałem zrobić coś takiego:

        marshaller.setProperty("com.sun.xml.bind.marshaller.NamespacePrefixMapper", new com.sun.xml.bind.marshaller.NamespacePrefixMapper() {

            @Override
            public String getPreferredPrefix(String string, String string1, boolean bln) {
                return "prefix";
            }
        });

ale mówi mi, że nie ma takiej property.
Jakiś pomysł jak to zrobić?

Pozostało 580 znaków

2011-10-19 03:50
02Eh
0

Pewnie do tego czasu juz sam doszedles, jak to zrobic. Jesli nie, to:

package-info.java

@XmlSchema(namespace = "http://host.com/MySchema",
        elementFormDefault = XmlNsForm.QUALIFIED,
        attributeFormDefault = XmlNsForm.QUALIFIED,
        xmlns={@XmlNs(namespaceURI = "http://host.com/MySchema", prefix = "ms")})
package host.com.jaxb.sample;

import javax.xml.bind.annotation.*;

package-info.java powinien byc automatycznie wygenerowany przez xjc jesli xsd zawiera targetNamespace. Jesli czesto generujesz szablony klas, mozesz uzupelnic *.xsd:

<xsd:schema targetNamespace="http://host.com/MySchema"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
            xmlns:ms="http://host.com/MySchema"
            jxb:version="2.1"
            elementFormDefault="qualified"
            attributeFormDefault="qualified">
    <!-- ... -->
</xsd:schema>

... ale wtedy, bedziesz musial zdefiniowac wlasny NamespacePrefixMapper, ktory bedzie nadpisywal domyslne nazwy "ns0", "ns1", itd.

    marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper",
        new com.sun.xml.bind.marshaller.NamespacePrefixMapper() {
            @Override
            public String getPreferredPrefix(String ns, String suggestion, boolean requirePrefix) {
                //...
            }
    });

HTH.

Pozostało 580 znaków

2011-10-19 09:07
0

hej, dzięki za odpowiedź. package-info.java marshaller mi te QUALIFIED ignoruje. Wpisy w xsd odpadają, bo dostaje xsd z zewnątrz i mogą się zmieniać. "marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper"," -tu również dostaję błąd, że nie ma takiej properties. Pewnie rozwiązaniem by była zmiana implementacji jaxb z domyślnej-ale średnio wiem jak to zrobić.

Póki co generuje xmla, a potem parsuję za pomocą XSL/Transform - trochę na około, ale działa;)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0