Hi,
please help me with my Java/woodstox code down below.
I also provide an xsd and two xml files in my example.
Best,
Peter
--------------------------------------------------------------
:: Main problem--------------------------------------------------------------
I turned on validation and would expect a validation error because
(a) the IDs foo1 as well as foo2 are defined twice in test2.xml,
(b) the ID foo is used without definition in test2.xml (unless the ID from test1.xml is taken into consideration as I would like it to happen using the XInclude), and
(c) the ID foo3 is used without definition in test2.xml.
However, no validation problem is shown.
--------------------------------------------------------------
:: test.xsd--------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="
http://www.w3.org/2001/XMLSchema">
<xs:attributeGroup name="ATTRIBUTES_TYPE_node">
<xs:attribute name="id1" type="xs:ID" use="required"/>
<xs:attribute name="id2" type="xs:ID" use="required"/>
<xs:attribute name="idref" type="xs:IDREF" use="optional"/>
</xs:attributeGroup>
<xs:complexType name="TYPE_node">
<xs:attributeGroup ref="ATTRIBUTES_TYPE_node"/>
</xs:complexType>
<xs:complexType name="TYPE_root">
<xs:sequence>
<xs:element name="node" type="TYPE_node" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:element name="root" type="TYPE_root"/>
</xs:schema>
--------------------------------------------------------------
:: test1.xml--------------------------------------------------------------
<?xml version="1.1" encoding="utf-8"?>
<root
xmlns:vc="
http://www.w3.org/2007/XMLSchema-versioning"
vc:minVersion="1.1"
vc:noNamespaceSchemaLocation="test.xsd">
<node id1="foo" id2="bar" idref="foo"/>
</root>
--------------------------------------------------------------
:: test2.xml--------------------------------------------------------------
<?xml version="1.1" encoding="utf-8"?>
<root
xmlns:vc="
http://www.w3.org/2007/XMLSchema-versioning"
vc:minVersion="1.1"
xmlns:xi="
http://www.w3.org/2001/XInclude"
vc:noNamespaceSchemaLocation="test.xsd">
<xi:include href="test1.xml">
<xi:fallback/>
</xi:include>
<node id1="foo1" id2="foo2" idref="foo"/>
<node id1="foo1" id2="foo2" idref="foo3"/>
</root>
--------------------------------------------------------------
:: Java Code--------------------------------------------------------------
XMLInputFactory xmlInputFactory = XMLInputFactory2.newInstance();
xmlInputFactory.setProperty(XMLInputFactory.IS_COALESCING, true);
xmlInputFactory.setProperty(XMLInputFactory.IS_VALIDATING, true);
xmlInputFactory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, true);
XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(new FileReader("src/main/resources/test2.xml"));
try {
xmlStreamReader.nextTag();
xmlStreamReader.require(XMLStreamConstants.START_ELEMENT, null, "root");
xmlStreamReader.nextTag();
while (true) {
if (xmlStreamReader.getEventType() == XMLStreamConstants.START_ELEMENT)
for (int i = 0; i < xmlStreamReader.getAttributeCount(); i++) {
System.out.println("getAttributePrefix=" + xmlStreamReader.getAttributePrefix(i));
System.out.println("getAttributeLocalName=" + xmlStreamReader.getAttributeLocalName(i));
System.out.println("getAttributeName=" + xmlStreamReader.getAttributeName(i));
System.out.println("getAttributeNamespace=" + xmlStreamReader.getAttributeNamespace(i));
System.out.println("getAttributeType=" + xmlStreamReader.getAttributeType(i));
System.out.println("getAttributeValue=" + xmlStreamReader.getAttributeValue(i));
}
xmlStreamReader.next();
}
} finally {
xmlStreamReader.close();
}
--------------------------------------------------------------
:: What I tried instead--------------------------------------------------------------
Should I better use
SAXParserFactory saxParserFactory = WstxSAXParserFactory.newInstance();
instead of
XMLInputFactory xmlInputFactory = XMLInputFactory2.newInstance();
as a first step in the code shown below? What is the difference?
However, with this I ran into problems when setting
saxParser.setProperty("
http://java.sun.com/xml/jaxp/properties/schemaLanguage","
http://www.w3.org/2007/XMLSchema-versioning");
where the SAXNotSupportedException "The specified schema language is not supported." resulted.
At least there I could use
xmlReader.setErrorHandler(new SimpleErrorHandler());
to install an error handler, which I did not do in my code above.
--------------------------------------------------------------
:: Addon Question1--------------------------------------------------------------
What is better for me: createXMLStreamReader or createXMLEventReader?
--------------------------------------------------------------
:: Addon Question2--------------------------------------------------------------
Do I need to adjust my XSD/XML files? Especially the headers?
--------------------------------------------------------------
:: Further Context--------------------------------------------------------------
* Clearly, the code is in an early stage where I do not bother much about how it ends.
* I use XML1.1 because I need xml-tags with more than one ID-attribute.
* I use XInclude because I want to define my xml-files in a modular way to avoid xml-code duplications.