cvc-elt.1: Cannot find the declaration of element 'MyElement' - xsd

I'm trying to validate a really simple xml using xsd, but for some reason I get this error.
I'll really appreciate if someone can explain me why.
XML File
<?xml version="1.0" encoding="utf-8"?>
<MyElement>A</MyElement>
XSD File
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/Test"
xmlns:tns="http://www.example.org/Test"
elementFormDefault="qualified">
<simpleType name="MyType">
<restriction base="string"></restriction>
</simpleType>
<element name="MyElement" type="tns:MyType"></element>
</schema>

Your schema is for its target namespace http://www.example.org/Test so it defines an element with name MyElement in that target namespace http://www.example.org/Test. Your instance document however has an element with name MyElement in no namespace. That is why the validating parser tells you it can't find a declaration for that element, you haven't provided a schema for elements in no namespace.
You either need to change the schema to not use a target namespace at all or you need to change the instance to use e.g. <MyElement xmlns="http://www.example.org/Test">A</MyElement>.

After making the change suggested above by Martin, I was still getting the same error. I had to make an additional change to my parsing code. I was parsing the XML file via a DocumentBuilder as shown in the oracle docs:
https://docs.oracle.com/javase/7/docs/api/javax/xml/validation/package-summary.html
// parse an XML document into a DOM tree
DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = parser.parse(new File("example.xml"));
The problem was that DocumentBuilder is not namespace aware by default. The following additional change resolved the issue:
// parse an XML document into a DOM tree
DocumentBuilderFactory dmfactory = DocumentBuilderFactory.newInstance();
dmfactory.setNamespaceAware(true);
DocumentBuilder parser = dmfactory.newDocumentBuilder();
Document document = parser.parse(new File("example.xml"));

I had this error for my XXX element and it was because my XSD was wrongly formatted according to javax.xml.bind v2.2.11 . I think it's using an older XSD format but I didn't bother to confirm.
My initial wrong XSD was alike the following:
<xs:element name="Document" type="Document"/>
...
<xs:complexType name="Document">
<xs:sequence>
<xs:element name="XXX" type="XXX_TYPE"/>
</xs:sequence>
</xs:complexType>
The good XSD format for my migration to succeed was the following:
<xs:element name="Document">
<xs:complexType>
<xs:sequence>
<xs:element ref="XXX"/>
</xs:sequence>
</xs:complexType>
</xs:element>
...
<xs:element name="XXX" type="XXX_TYPE"/>
And so on for every similar XSD nodes.

I got this same error working in Eclipse with Maven with the additional information
schema_reference.4: Failed to read schema document 'https://maven.apache.org/xsd/maven-4.0.0.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.
This was after copying in a new controller and it's interface from a Thymeleaf example. Honestly, no matter how careful I am I still am at a loss to understand how one is expected to figure this out. On a (lucky) guess I right clicked the project, clicked Maven and Update Project which cleared up the issue.

To expand upon the top answer. If you're using Java Web Services (JAX-WS) annotations to define your services, like in this example:
#WebService(..., targetNamespace = "http://bar.foo.com/")
Then make sure that your SOAP request has exactly the same namespace as defined in your annotation:
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:foo="http://bar.foo.com/">
<soapenv:Header/>
<soapenv:Body>
<foo:someRequest>
...
</foo:someRequest>
</soapenv:Body>
</soapenv:Envelope>
The targetNamespace in your annotation and the xmlns:foo property in the XML request must match! Literally every character (including whitespace) must match. Also don't forget to put the / at the end as well (it's a very common mistake).

Related

How to create and XSD schema file from a Codefluent CFP file?

I'm working on a project which uses Codefluent entities to define the application's schema and produce and SQL database, class libraries, web pages, and winforms. Also used are the Altova XmlSpy products.
I am trying to figure out how I can extract from the Codefluent model an XSD schema representation of the Codefluent model so that it could be used with Altova's XmlStyleVision.
In Softfluent's documentation, https://www.softfluent.com/documentation/CF_Tools_Builder.html, there is a compile option "/ExtractSchema" but that create 5000 lines of attributes and enumerations and contains nothing relating to the data model.
Any thoughts or suggestions would be greatly appreciated!
/ExtractSchema extracts the xsd for creating CodeFluent Entities models. For instance, this allows you to get auto-completion in Visual Studio. This schema is not related to your model, and is not what you want.
The easiest way to generate a schema for you model is to create a template and add the Template Producer to your model. First, create a folder and add a file named [Template]schema.xsd (must be prefixed by [Template]). I don't know what Altova's XmlStyleVision needs, but the following template should be a good start.
[%# namespace name="CodeFluent.Model"%]
[%# namespace name="CodeFluent.Model.Persistence"%]
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
[%foreach (Entity e in Producer.Project.Entities)
{%]
<xs:element name="[%= e.Name %]">
<xs:complexType>
<xs:sequence>
[%foreach (Property p in e.Properties) { %]
<xs:element name="[%= p.Name %]" type="xs:string" />
[% } %]
</xs:sequence>
</xs:complexType>
</xs:element>
[% } %]
</xs:schema>
Finally, add the template producer to your model: https://www.softfluent.com/documentation/TemplateProducers_TemplateProducer.html
Now, the xsd file will be generated when you build the model.

Using XJC to compile a XSD with mutiple schema

I have a XSD of the format:
<?xml version="1.0" encoding="utf-16"?>
<root>
<xs:schema --->
..
..
</xs:schema>
<xs:schema -->
..
..
</xs:schema -->
<xs:schema -->
..
..
</xs:schema -->
</root>
It gives an error when compiled using XJC compiler at line 1 "Content is not allowed in prolog".
If I change the encoding to , "ISO-8859-1"
it gives followwing error:
[ERROR] Unexpected <root> appears at line 2 column 10
line 2 of ****.xsd Failed to parse a schema.
If I remove the "root" tag, from the XSD, it starts giving the following error:
[ERROR] The markup in the document following the root element must be well-formed.
line 44 of file:****.xsd
Failed to parse a schema.
My question is whether we can use XJC to compile a XSD with more than 1 schema tag. I had tried this with following file format :
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="shiporder">
<xs:complexType>
<xs:sequence>
<xs:element name="abc" type="xs:string"/>
<xs:element name="cdf">
/xs:element>
</xs:sequence>
<xs:attribute name="orderid" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>
it worked perfectly well for the above , creating classes appropriately.
Does it has something to do with the namespace declaration?
In principle, the XSD spec allows multiple xs:schema elements to be included in the same XML document, so what you are trying to do is not unreasonable. In practice, a lot of XSD software (perhaps most XSD software) is not prepared for schema documents in which the xs:schema element is not the outermost element in the XML document, and even when software does support other cases, different programs don't always agree on how to behave.
See this Stack Overflow question for further discussion, including a passionate argument from a misinformed party that there is no XSD software at all that supports input of the kind you describe.
With XJC, your best option appears to be to put each xs:schema element in a separate XML document and use (a) a single driver file to import or include each of them in turn, or (b) to put them all in the same directory and hand XJC the name of the directory; it will scan the directory for schema files and compile them. You may also be able to do something with the -wsdl option.

Can JAXB handle multiple "root" elements?

I have a schema similar to the following...
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="t1" type="t1Type"/>
<xs:element name="t2" type="t2Type"/>
<xs:element name="t3" type="t3Type"/>
</xs:schema>
At first I thought this was an invalid schema but all the checks I do online validate it. This means the person supplying the XML can send any (or all) the types listed and still conform to the schema.
How do I go about mapping and unmarshalling all the different possibilities using JAXB?
I have no idea which of them I will be recieving.
You will need to leverage a factory class annotated with #XmlRegistry (usually called ObjectFactory). That class will contain a create method for each possible root element annotated with #XmlElementDecl. See this article I wrote for more details and examples.

Using dom4j DOMDocument to feed validator.validate(DOMSource) fails in java 1.6 (xsi:noNamespaceSchemaLocation is not allowed), works in 1.5

Using dom4j DOMDocument to feed validator.validate(DOMSource) fails in java 1.6 (with xsi:noNamespaceSchemaLocation is not allowed to appear in root element), works in 1.5
I'm finding the following problem quite intractable (OK, that's an understatement) - any insights will be appreciated. Currently it seems like the best idea is to drop dom4j in favour of e.g. XOM (http://stackoverflow.com/questions/831865/what-java-xml-library-do-you-recommend-to-replace-dom4j).
I've been validating in memory XML created from dom4j 'new DOMDocument()' - but this will not work with Java 6.
The following call to validate(source) of a dom4j (1.6.1) DOMDocument derived DOMSource works with Java 1.5.x but fails with Java 1.6.x:
public void validate() throws Exception {
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
schemaFactory.setErrorHandler(null);
Schema schemaXSD = schemaFactory.newSchema(new URL(getSchemaURLString()));
Validator validator = schemaXSD.newValidator();
DOMSource source = new DOMSource(getDocument());
validator.validate(source);
}
getSchemaURLString() is also used to add the xsi:noNamespaceSchemaLocation attribute to the root node, i.e.:
xsi:noNamespaceSchemaLocation="http://localhost:8080/integration/xsd/fqlResponseSchema-2.0.xsd"
The exception follows:
Exception: org.xml.sax.SAXParseException: cvc-complex-type.3.2.2: Attribute 'xsi:noNamespaceSchemaLocation' is not allowed to appear in element 'specialfields'.;
complex-type.3.2.2: Attribute 'xsi:noNamespaceSchemaLocation' is not allowed to appear in element 'specialfields'.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:318)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator$XSIErrorReporter.reportError(XMLSchemaValidator.java:417)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.reportSchemaError(XMLSchemaValidator.java:3182)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.processAttributes(XMLSchemaValidator.java:2659)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStartElement(XMLSchemaValidator.java:2066)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(XMLSchemaValidator.java:705)
at com.sun.org.apache.xerces.internal.jaxp.validation.DOMValidatorHelper.beginNode(DOMValidatorHelper.java:273)
at com.sun.org.apache.xerces.internal.jaxp.validation.DOMValidatorHelper.validate(DOMValidatorHelper.java:240)
at com.sun.org.apache.xerces.internal.jaxp.validation.DOMValidatorHelper.validate(DOMValidatorHelper.java:186)
at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl.validate(ValidatorImpl.java:104)
at javax.xml.validation.Validator.validate(Validator.java:127)
Here's the start of the XML - generated after disabling the call to validator.validate(source):
<?xml version="1.0" encoding="utf-8"?>
<meetings xsi:noNamespaceSchemaLocation="http://localhost:8080/integration/xsd/fqlResponseSchema-2.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
.............
</meetings>
And of the XSD:
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="meetings">
<xs:complexType>
<xs:choice>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" ref="summary" />
<xs:element minOccurs="0" maxOccurs="unbounded" ref="meeting" />
</xs:sequence>
<xs:element ref="error" />
</xs:choice>
</xs:complexType>
</xs:element>
<xs:element name="summary">
................
So my root element is being rejected because it contains a xsi:noNamespaceSchemaLocation attribute. And the schema itself does not specify that as a valid attribute of my root element?
At this point it seems to me that I need to give up on dom4j for this task and switch to one of the other solutions, for example as outlined here:
But I'd like to know what I've done wrong at any rate!
Thanks in advance.
I had the same issue, and I found the following documentation at
http://www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi/index.html
Validate against a document-specified schema
Some documents specify the schema they expect to be validated against,
typically using xsi:noNamespaceSchemaLocation and/or
xsi:schemaLocation attributes like this:
<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://www.example.com/document.xsd">
...
If you create a schema without specifying a URL, file, or source, then
the Java language creates one that looks in the document being
validated to find the schema it should use. For example:
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
Schema schema = factory.newSchema();
However, normally this isn't what you want. Usually the document
consumer should choose the schema, not the document producer.
Furthermore, this approach works only for XSD. All other schema
languages require an explicitly specified schema location.
The reason seems to be that non-namespace aware JAXP SAXParser is being created and used (see Link).
And solution for different libs I found at www.edankert.com.

Combining HTML and XML from one schema all nested within an element of yet another schema

I have been working on learning XML Schema for the past few years now, off and on. I have a pretty good handle on the basics but one thing still eludes me:
I want to be able to create an XML document similar to the following:
<itemList xmlns="http://mydomain.com/namespaceA">
<item>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:nsB="http://mydomain.com/namespaceB">
<body>
<p>Any HTML code here but I want to be able to mark up
<nsB:myBTag><strong>some</strong> of the text</nsB:myBTag>
with tags from namespaceB even if those tags are nested within
standard HTML tags and even if there are then more HTML tags
nested within my namespaceB tags.</p>
</body>
</html>
</item>
</itemList>
Note that inside the <html> element the xhtml namespace is the default namespace. This is because I want document authors to be able to use a standard HTML editor and then simply insert the special namespaceB tags where they need them. There will be far more XHTML tags than namespaceB tags in any one instance document.
So, from what I have tentatively learned so far, I think my two schemas will need to look something like this:
namespaceA
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:nsA="http://mydomain.com/namespaceA"
targetNamespace="http://mydomain.com/namespaceA">
<xs:element name="itemList">
<xs:complexType>
<xs:sequence>
<xs:element name="item" maxOccurs="unbounded" minOccurs="1">
<xs:complexType>
<xs:any namespace="http://www.w3.org/1999/xhtml"
minOccurs="1" maxOccurs="1"
processContents="strict">
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
(I think the only namespace I need to declare for the content model within the <item> tag is the XHTML namespace because then the <html> tag in the instance document declares the namespaceB namespace, but I am in no way positive.)
namespaceB
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:nsB="http://mydomain.com/namespaceB"
targetNamespace="http://mydomain.com/namespaceB">
<xs:element name="myBTag">
<!-- I am clueless here -->
<!-- I have no idea how to make sure that additional HTML tags
can go in here without screwing everything up -->
</xs:element>
</xs:schema>
The big question is: Do I need to do anything to make sure that XHTML and namespaceB tags can be freely intermixed or is that just part and partial of the operation of the <xs:any> tag?
Naturally, my schemas and documents will be far more complicated than this. I have simplified them down for easy discussion. Thanks in advance for any help you can provide. If I can get over this one hurdle I can create a really powerful system for educational content that will help educate the whole world for free.
According to the XS spec, the <xs:any> element can have a namespace attribute which can have the value ##any - this means that the corresponding element in the document can have any namespace.
The namespace attribute being absent has the same effect - so you can just omit it. i.e. the answer to the "big question" is:
Do I need to do anything to make sure that XHTML and namespaceB tags can be freely intermixed? No, you don't
Or is that just part and partial of the operation of the tag? Yes, it is
Disclaimer: I haven't tested this, only read the spec above. If I were you, I'd try validating some example XML documents with your simplified XSDs above, using a popular XSD validator, to determine under what conditions it validates.

Resources