JAXB validation returning non-required fields - json

I am validating a Java object using the Validator API. THis works as far as telling me that the object is not valid according to the schema, but it gives a very vague error message that one of the elements from a list of all the element's properties are missing.
Schema (truncated for clarity):
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://predictivesolutions.com/schema/v1_1" xmlns:snt="http://predictivesolutions.com/schema/v1_1"
elementFormDefault="qualified">
<xs:element name="contactInsert">
<xs:complexType>
<xs:all>
<xs:element name="suffix" type="snt:stringType255"
minOccurs="0" maxOccurs="1" />
<xs:element name="firstName" type="snt:stringType255"
minOccurs="1" maxOccurs="1" />
<xs:element name="lastName" type="snt:stringType255"
minOccurs="1" maxOccurs="1" />
<xs:element name="companyID" type="snt:idType" minOccurs="1"
maxOccurs="1" />
<xs:element name="companyLocationID" type="snt:idType"
minOccurs="1" maxOccurs="1" />
<xs:element name="workPhone" type="snt:phoneType"
minOccurs="0" maxOccurs="1" />
<xs:element name="cellPhone" type="snt:phoneType"
minOccurs="0" maxOccurs="1" />
<xs:element name="homePhone" type="snt:phoneType"
minOccurs="0" maxOccurs="1" />
<xs:element name="otherPhone" type="snt:phoneType"
minOccurs="0" maxOccurs="1" />
I am basically deserializing a JSON object to the JAXB generated class from the schema above. Again this works:
ValidationErrorHandler errorHandler = null;
try {
JAXBContext jc = JAXBContext.newInstance(ContactInsert.class);
JAXBSource source = new JAXBSource(jc, contactInsert);
SchemaFactory sf = SchemaFactory
.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(ContactInsert.class
.getResource("/xsd/v1_1/contact.xsd"));
Validator validator = schema.newValidator();
errorHandler = new ValidationErrorHandler();
validator.setErrorHandler(errorHandler);
validator.validate(source);
My JSON object gets converted to the ContactInsert instance:
{ "companyID":666, "lastName":"dsadasd", "companyLocationID":23950, "otherComments":null }
I would expect the validation error to be that "firstName" is expected, however it lists every element from the schema, even though these are not required (minOccurs=0 and not annotated with #Required in the generated Java class:
"cvc-complex-type.2.4.b: The content of element 'contactInsert' is not
complete. One of
'{"http://predictivesolutions.com/schema/v1_1":suffix,
"http://predictivesolutions.com/schema/v1_1":firstName,
"http://predictivesolutions.com/schema/v1_1":workPhone,
"http://predictivesolutions.com/schema/v1_1":cellPhone,
"http://predictivesolutions.com/schema/v1_1":homePhone,
"http://predictivesolutions.com/schema/v1_1":otherPhone,
"http://predictivesolutions.com/schema/v1_1":faxPhone,
"http://predictivesolutions.com/schema/v1_1":email,
"http://predictivesolutions.com/schema/v1_1":isDesignate,
"http://predictivesolutions.com/schema/v1_1":isActive,
"http://predictivesolutions.com/schema/v1_1":mainSponsorID,
"http://predictivesolutions.com/schema/v1_1":hidePercentSafeFlag,
"http://predictivesolutions.com/schema/v1_1":externalContactID,
"http://predictivesolutions.com/schema/v1_1":useAsARef,
"http://predictivesolutions.com/schema/v1_1":positionTitle,
"http://predictivesolutions.com/schema/v1_1":otherComments,
"http://predictivesolutions.com/schema/v1_1":formerCompanyID,
"http://predictivesolutions.com/schema/v1_1":industryStartDate,
"http://predictivesolutions.com/schema/v1_1":employmentStartDate}' is
expected."
Is it possible to configure the validator to only report the required field ("firstName"). I am relatively new to JAXB, but it seems like that error message is not accurate, and that JAXB is simply taking the easy way out by saying one of the elements is missing, but I will not tell you which.

Where is the Error Coming From
The error message being returned is from the javax.xml.validation.Validator and not JAXB. In this use case JAXB is simply the XML source. If you swapped in a StAXSource the StAX parser wouldn't become responsible for the schema validation.
Is it a Good Error?
OK...but why does validator report all those fields in the error
message?
Here is the error you are getting:
"cvc-complex-type.2.4.b: The content of element 'contactInsert' is not
complete. One of
'{"http://predictivesolutions.com/schema/v1_1":suffix,
"http://predictivesolutions.com/schema/v1_1":firstName,
"http://predictivesolutions.com/schema/v1_1":workPhone,
"http://predictivesolutions.com/schema/v1_1":cellPhone,
"http://predictivesolutions.com/schema/v1_1":homePhone,
"http://predictivesolutions.com/schema/v1_1":otherPhone,
"http://predictivesolutions.com/schema/v1_1":faxPhone,
"http://predictivesolutions.com/schema/v1_1":email,
"http://predictivesolutions.com/schema/v1_1":isDesignate,
"http://predictivesolutions.com/schema/v1_1":isActive,
"http://predictivesolutions.com/schema/v1_1":mainSponsorID,
"http://predictivesolutions.com/schema/v1_1":hidePercentSafeFlag,
"http://predictivesolutions.com/schema/v1_1":externalContactID,
"http://predictivesolutions.com/schema/v1_1":useAsARef,
"http://predictivesolutions.com/schema/v1_1":positionTitle,
"http://predictivesolutions.com/schema/v1_1":otherComments,
"http://predictivesolutions.com/schema/v1_1":formerCompanyID,
"http://predictivesolutions.com/schema/v1_1":industryStartDate,
"http://predictivesolutions.com/schema/v1_1":employmentStartDate}' is
expected."
This implementation has chosen to list all of the possible elements that may occur here. If only the required elements where listed someone could have opened a question similar to this one as to why the optional elements were omitted.

Related

XSD Schema for the JSON Body

I would like to get the XSD schema for the below JSON Body.
[
{"text": "Hello"},
{"text": "How are you?"}
]
For instance, if I convert online the above JSON body to XML and then to XSD schema, it gives the below output.
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="row">
<xs:complexType>
<xs:sequence>
<xs:element name="text" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
The intent is to use the XSD schema in Informatica Rest web consumer transformation.
With the above XSD schema, the JSON body is creating as below, which is not desired request body:
{"row": [
{"text": "Hello"},
{"text": "How are you?"}
]}
Is there anyway, I can skip the row tag?
Any help in this regard?
JSON and XML have different data models, which means that lossless round-tripping is generally impossible. If you want to achieve it, you will need to write custom code that understands your specific data. A good tool for this job is XSLT 3.0.

Conversion of XML Schema to JSON array list in Biztalk

I have defined a xml scehema below
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1">
<xs:element name="Root">
<xs:complexType>
<xs:all>
<xs:element name="bblist">
<xs:complexType>
<xs:sequence>
<xs:element name="item" type="xs:string" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
</xs:schema>
I want to generate the Json below using a pipeline.
{
"bblist":
[
"13403"
]
}
but the BizTalk pipeline converts it to
{"bblist": "13403"}
Just wondering if my schema is correct. Am I defining the xsd to generate Json arrays correctly?
There are three issues with your XSD schema
You haven't defined a target Namespace. Which means when it goes through the XML Receive it sets the MessageType to a default set of values which doesn't reference the schema. Which means it might not know which schema to use in the JSON Encoder.
MessageType Root Promoted http://schemas.microsoft.com/BizTalk/2003/system-properties
You have used a <xs:all> rather than a <xs:sequence> in your schema definition. That the JSON Encoder doesn't handle.
If you define your schema as this
<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns="http://bblist" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" targetNamespace="http://bblist" vc:minVersion="1.1" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Root">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="1" name="bblist">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="1" maxOccurs="unbounded" name="item" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
With a payload of
<ns0:Root xmlns:ns0="http://bblist">
<bblist>
<item>item_0</item>
</bblist>
</ns0:Root>
You get a output of
{
"bblist": {
"item": [
"item_0"
]
}
}
This is closer to your expected JSON, with it making an array of the repeating element.
Your structure is incorrect for the JSON you are expecting as you have the repeat on the item and not on the blist.
If you define your schema as
<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns="http://bblist" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" targetNamespace="http://bblist" vc:minVersion="1.1" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Root">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="1" maxOccurs="unbounded" name="blist" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
XML is
<ns0:Root xmlns:ns0="http://bblist">
<blist>blist_0</blist>
</ns0:Root>
JSON is
{
"blist": [
"blist_0"
]
}

BizTalk JSON encoder pipeline generating incorrect JSON object from XSD

I am using BizTalk pipeline with JSON encoder to convert XML to JSON .
I have created the XSD but the JSON generated has #text instead of just a value for my elements.
Any ideas what I'm doing wrong?
<xs:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="http://BookingEngine.Schemas.JSONSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="1" name="affiliate_reference_id" type="xs:unsignedShort" />
<xs:element minOccurs="1" name="hold" type="xs:boolean" />
<xs:element minOccurs="1" maxOccurs="unbounded" name="rooms">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="1" name="email" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element minOccurs="1" maxOccurs="unbounded" name="payments">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="1" name="type" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element minOccurs="1" name="affiliate_metadata" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
is converted to the following JSON
{
"affiliate_reference_id": {
"#text": "4480"
},
"hold": {
"#text": "false"
},
"rooms": [
{
"email": "john#example.com"
}
],
"payments": [
{
"type": "customer_card"
}
]
}
expected results would be
{
"affiliate_reference_id": "4480",
"hold": "false",
"rooms": [
{
"email": "john#example.com"
}
],
"payments": [
{
"type": "customer_card"
}
]
}
Any idea why the #text is popping up and how to remove it?
What do I need to change in my XSD schema?
‪I've the same result in c# when using Newtonsoft. The #text nodes are added when they have a different namespace than the root-namespace because in JSON it becomes an object with a text and a attribute namespace. ‬
I added a custom biztalk pipeline and used json newton soft nuget package .
I created a pipeline with a JSON encoder and had this same issue.
The secret is you need to add an XML encoder before the JSON encoder in your pipeline. Yes, it's odd.
Create a schema with the correct data types for the JSON results you want. Add that schema to the XML encoder document schema property. The schema allows you to control how the JSON encoder works.
Note: XML requires a single root node but JSON does not. In your JSON assembly schema create a root node with any name you like. In the JSON encoder there's a check box to remove the root node enclosing the payload.
Javascript data types are not the same as XML (such as dates) so some translation may be needed.

JAXB XML Object Marshalling without namespace prefixes

Im working on a java project where i need to read some objects from an XML file, do some processing which will alter the object´s atributes and then write the Object to another XML file. For that purpose, i am using JAXB with its marshalling and unmarshalling capabilities, each of them in a method, like this:
private MyObject unmarshallXMLFile(String file) {
MyObject t=null;
try {
jc = JAXBContext.newInstance("foo.bar");
Unmarshaller unmarshaller = jc.createUnmarshaller();
SchemaFactory sf = SchemaFactory.newInstance(javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI);
unmarshaller.setSchema(sf.newSchema(new File("MySchema.xsd")));
t = (Task) unmarshaller.unmarshal(new File(file));
} catch (JAXBException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
return t;
}
private void marshallXMLFile(String file) {
task.setReplay(Boolean.TRUE);
Marshaller marshaller;
try {
marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, new Boolean(true));
marshaller.marshal(task, new FileOutputStream(file));
} catch (JAXBException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
The problem is that automatically-generated namespace prefixes such as ns2 or ns3 keep appearing in the output file, and then when i want to reuse this files with the unmarshallXMLFile method (i will be using the output files as input again later) it wont get validated against the schema, and throws a org.xml.sax.SAXParseException. Here are the files i wrote:
XML Schema: MySchema.xsd
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/MySchema"
xmlns:spm="http://www.example.org/MySchema"
elementFormDefault="qualified"
attributeFormDefault="qualified">
<element name="task" >
<complexType>
<sequence>
<element name="replay" type="boolean" default="false"/>
<element name="threads" type="spm:spThread" maxOccurs="unbounded" minOccurs="1" />
</sequence>
</complexType>
</element>
<complexType name="spThread">
<sequence>
<element name="SPThreadID" type="int" />
<element name="durtime" minOccurs="0" default="0">
<simpleType>
<restriction base="int">
<minInclusive value="0" />
</restriction>
</simpleType>
</element>
<element name="minexecutions" minOccurs="0" default="0">
<simpleType>
<restriction base="int">
<minInclusive value="0" />
</restriction>
</simpleType>
</element>
<element name="numThreads" type="int" />
<element name="procedures" type="spm:procedure" minOccurs="1"
maxOccurs="unbounded" />
</sequence>
</complexType>
<complexType name="procedure">
<sequence>
<element name="id" type="int" minOccurs="1" />
<element name="name" type="string" minOccurs="1" />
<element name="weight" minOccurs="1">
<simpleType>
<restriction base="int">
<minInclusive value="0" />
<maxInclusive value="100" />
</restriction>
</simpleType>
</element>
<element name="parameterPool" type="spm:parameter" nillable="true"
minOccurs="0" maxOccurs="unbounded" />
</sequence>
</complexType>
<complexType name="parameter">
<sequence>
<element name="name" type="string" minOccurs="1" />
<element name="dataType" type="spm:parameterDataType" default="integer"/>
<element name="parmType" type="spm:parameterType" default="in"
minOccurs="0" />
<element name="minValue" type="string"/>
<element name="maxValue" type="string"/>
<element name="value" type="string"/>
</sequence>
</complexType>
<simpleType name="parameterDataType">
<restriction base="string">
<enumeration value="integer" />
<enumeration value="varchar" />
<enumeration value="char" />
</restriction>
</simpleType>
<simpleType name="parameterType">
<restriction base="string">
<enumeration value="in" />
<enumeration value="out" />
<enumeration value="in_out" />
</restriction>
</simpleType>
</schema>
input file:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<task xmlns="http://www.example.org/MySchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/MySchema MySchema.xsd ">
<replay>true</replay>
<threads>
<SPThreadID>0</SPThreadID>
<durtime>10</durtime>
<minexecutions>2</minexecutions>
<numThreads>3</numThreads>
<procedures>
<id>1</id>
<name>run</name>
<weight>15</weight>
<parameterPool>
<name>energy</name>
<dataType>integer</dataType>
<parmType>in</parmType>
<minValue>10</minValue>
<maxValue>50</maxValue>
<value>11</value>
</parameterPool>
<parameterPool>
<name>speed</name>
<dataType>integer</dataType>
<parmType>in</parmType>
<minValue>12</minValue>
<maxValue>80</maxValue>
<value>13</value>
</parameterPool>
</procedures>
</threads>
</task>
output file (without any processing whatsoever: just unmarshalling and marshalling back with the methods mentioned earlier)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:task xmlns="http://www.example.org/MySchema" xmlns:ns2="http://www.example.org/MySchema.xsd">
<replay>true</replay>
<threads>
<SPThreadID>0</SPThreadID>
<durtime>10</durtime>
<minexecutions>2</minexecutions>
<numThreads>3</numThreads>
<procedures>
<id>1</id>
<name>run</name>
<weight>15</weight>
<parameterPool>
<name>energy</name>
<dataType>integer</dataType>
<parmType>in</parmType>
<minValue>10</minValue>
<maxValue>50</maxValue>
<value>11</value>
</parameterPool>
<parameterPool>
<name>speed</name>
<dataType>integer</dataType>
<parmType>in</parmType>
<minValue>12</minValue>
<maxValue>80</maxValue>
<value>13</value>
</parameterPool>
</procedures>
</threads>
</ns2:task>
exception (when using the ouput file again as an input):
javax.xml.bind.UnmarshalException
- with linked exception:
[org.xml.sax.SAXParseException: cvc-elt.1: The declaration of the element'ns3:task' could not be found.]
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(AbstractUnmarshallerImpl.java:326)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.createUnmarshalException(UnmarshallerImpl.java:500)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:206)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:175)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:148)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:153)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:162)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:180)
at Test.main(Test.java:48)
Caused by: org.xml.sax.SAXParseException: cvc-elt.1: The declaration of the element'ns3:task' could not be found.
at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(Unknown Source)
at org.apache.xerces.jaxp.validation.XMLSchemaValidatorHandler.startElement(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.ValidatingUnmarshaller.startElement(ValidatingUnmarshaller.java:85)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:113)
at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source)
at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
at org.apache.xerces.impl.XMLNSDocumentScannerImpl$NSContentDispatcher.scanRootElementHook(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:202)
... 6 more
I´ve been reading about the subject and tried loads of related answers, but none of them seems to remove the prefixes. I went trough this guide but the version of jaxb i am using does not support NamespacePrefixMapper. I tried using annotations as described here to configure the prefixes but that wouldnt work.
Maybe there is a way of getting rid of this namespace prefixes: all the forums, answers and discussions i´ve found talk about customizing this prefixes, i just want to get rid of them. But somehow it makes me think that i´m missing something in both my input file and schema. Are they well written? I would say that right there is the problem, because it is the first time i work with xml and xsd at this depth, and what i´ve done is only based on what i´ve found online. Any tips on improving the xml and xsd designs would be highly appreciated
should i be using some kind of prefixes in the input file or in the schema so the JAXB framework wont generate random prefixes at time of marshalling?
thanks in advance, i hope you guys can help me.
--
Thank you very much for the answer. In that way i can use the NamespacePrefixMapper. However, when i use it, my code keeps throwing exceptions when i run it:
Exception in thread "main" java.util.MissingResourceException: Can't find bundle for base name javax.xml.bind.Messages, locale de_DE
at java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:863)
at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:832)
at java.util.ResourceBundle.getBundle(ResourceBundle.java:576)
at javax.xml.bind.Messages.format(Messages.java:47)
at javax.xml.bind.Messages.format(Messages.java:36)
at javax.xml.bind.PropertyException.<init>(PropertyException.java:99)
at javax.xml.bind.helpers.AbstractMarshallerImpl.setProperty(AbstractMarshallerImpl.java:349)
at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.setProperty(MarshallerImpl.java:527)
at Test.main(Test.java:95)
I found that it has to do something with a .properties file: i am not using anything like it, i havent changed anything.
Instead of specifying the #XmlElement's namespace attribute in every element, it's simpler to annotate at package level.
You do that by creating a file package-info.java just underneath the package you want to annotate.
For example, if you want to annotate the package org.example, then a file named package-info.java must be placed within the directory org/example with the following content:
#javax.xml.bind.annotation.XmlSchema(namespace = "http://www.example.org/StoredProceduresSchema", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package org.example;
It's important to note that you must annotate every package that contains classes that your plan to marshal or are referenced by those.
Hope this helps :)
Try using a NamespacePrefixMapper:
NamespacePrefixMapper mapper = new NamespacePrefixMapper() {
public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
return "";
}
};
marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", mapper);
Well, after some research, i tried using the #XMLElement tag on every attribute of the classes i am trying to serialize, specifying clearly what my namespace was, and using the same one on every attribute:
#XmlElement(required = true, name="myObjectPool", namespace="http://www.example.org/StoredProceduresSchema")
protected List<MyObject> myObjectPool;
It worked flawlessly: no more weird namespaces in the marshalled file.
I wanna thank for his answer: i tried that as well, but i got a weird language bundle related exception. Im glad this simpler approach solved the issue.
Then you might be using a different JAXB implementation then the reference. Read this article and try again: http://blog.bdoughan.com/2011/11/jaxb-and-namespace-prefixes.html (or if you are lazy: replace com.sun.xml.bind.namespacePrefixMapper with com.sun.xml.internal.bind.namespacePrefixMapper)
Java 7/8 solution
This problem is related to the default implementation JAXB Provider. I have found a solution using a different implementation: EclipseLink MOXy.
1. add the dependency in pom.xml
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>org.eclipse.persistence.moxy</artifactId>
<version>2.5.0</version>
</dependency>`
2. create a file jaxb.properties containing the following line
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
move the file into the package model
3. create package-file.java into the model package
#XmlSchema(xmlns = { #XmlNs(prefix = "video", namespaceURI = "http://www.google.com/schemas/sitemap-video/1.1"),
#XmlNs(prefix = "", namespaceURI = "http://www.sitemaps.org/schemas/sitemap/0.9")})
package it.my.sitemap.model;
import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlSchema;

XML validation fails with error "Top level is not completed"

I've got what seems like a very simple example of an xsd and xml file where the xml file does not validate.
Copies of the two files are below.
The first xml element with id = 'fixMe' gets an error that says
Top level is not completed.
Valid xml document must have a root tag
If I remove its id attribute or use "idx" instead of "id", it's fine. But I can't figure out why. 'id' should be a valid attribute.
Any insight appreciated.
XML:
<question id="fixMe" />
<question idx="ok"/>
<question />
XSD:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="perceptive.com/mi/analysis"
xmlns="perceptive.com/mi/analysis"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="test" type="test"/>
<xs:complexType name="test">
<xs:sequence minOccurs="1" maxOccurs="10">
<xs:element name="question" type="question_type"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="question_type">
<xs:attribute name="idx" type="xs:string" use="optional"/>
<xs:attribute name="id" type="xs:string" use="optional"/>
</xs:complexType>
</xs:schema>
An XML document cannot be valid until it is well-formed.
So you should specify a root tag in XML document, e.g.:
<root>
<question id="fixMe" />
<question idx="ok"/>
<question />
</root>