I played a little bit.
Jan
public class XmlTest extends CamelTestSupport {
@EndpointInject(uri="mock:valid")
MockEndpoint valid;
@EndpointInject(uri="mock:validationError")
MockEndpoint validationError;
@Test
public void validNewsfeed() throws Exception {
// Newsfeed contains 2 news
valid.expectedMessageCount(2);
valid.expectedMessagesMatches(
// Use helper methods from the static imported PredicateBuilder
and(
header("newsfeed.date").isEqualTo("2014.12.09 14:15"),
header("news.author").isEqualTo("Jan"),
body().contains("xmlns:news=\"http://www.materne.de/camel/test/xml/complex/\
"")
)
);
// no error expected
validationError.expectedMessageCount(0);
// Read xml from classpath and send to Camel route
String xml =
IOUtils.toString(getClass().getResourceAsStream("/de/materne/camel/test/xml/
complex/validNewsfeed.xml"));
sendBody("direct:in", xml);
// 'execute' all tests
assertMockEndpointsSatisfied();
}
@Test
public void invalidXml() throws Exception {
valid.expectedMessageCount(0);
validationError.expectedMessageCount(1);
String xml = "<xml/>";
sendBody("direct:in", xml);
assertMockEndpointsSatisfied();
}
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
// Our XML uses namespaces, so we have to deal with that.
Namespaces ns = new Namespaces("news",
"http://www.materne.de/camel/test/xml/complex/");
// XSD-invalid data goes to this endpoint
onException(ValidationException.class)
.to("mock:validationError");
from("direct:in")
// XSD-validation
.to("validator:de/materne/camel/test/xml/complex/newsfeed.xsd")
// Store newsfeed data in the header before split, so we
haven't to do that on each
// splittet news-message.
.setHeader("newsfeed.date",
ns.xpath("/news:Newsletter/@date", String.class))
// http://camel.apache.org/splitter.html
// xtokenize() is available since Camel 2.14.
// Use the 'wrap'-mode so we keep the Newsletter-Header
.split().xtokenize("/news:Newsletter/News", 'w', ns)
// Workaround of a bug?? in XMLTokenizerExpression
.setBody(simple("${body.replace('</</news:Newsletter>',
'</news:Newsletter>')}"))
.setBody(simple("${body.replace('<</news:Newsletter>',
'</news:Newsletter>')}"))
// Get some data from the splittet news
.setHeader("news.date",
ns.xpath("/news:Newsletter/News/@date", String.class))
.setHeader("news.author",
ns.xpath("/news:Newsletter//News/@author", String.class))
.to("mock:valid");
}
};
}
}
<?xml version="1.0" encoding="UTF-8"?>
<schema
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:news="http://www.materne.de/camel/test/xml/complex/"
targetNamespace="http://www.materne.de/camel/test/xml/complex/">
<element name="Newsletter">
<complexType>
<sequence>
<element name="News" minOccurs="1"
maxOccurs="unbounded">
<complexType>
<simpleContent>
<extension
base="string">
<attribute
name="date" type="string"/>
<attribute
name="author" type="string"/>
</extension>
</simpleContent>
</complexType>
</element>
</sequence>
<attribute name="date" type="string"/>
</complexType>
</element>
</schema>
<news:Newsletter
xmlns:news="http://www.materne.de/camel/test/xml/complex/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.materne.de/camel/test/xml/complex/
newsfeed.xsd "
date="2014.12.09 14:15">
<News date="2014.12.09 14:15" author="Jan">
Here is a demo news.
</News>
<News date="2014.12.09 14:13" author="Jan">
Second news paragraph.
</News>
</news:Newsletter>
> -----Ursprüngliche Nachricht-----
> Von: smilevasu6 [mailto:[email protected]]
> Gesendet: Dienstag, 9. Dezember 2014 15:12
> An: [email protected]
> Betreff: Re: AW: camel - xsd
>
> Don't mind can you give me sample code instead of link
>
>
>
> --
> View this message in context: http://camel.465427.n5.nabble.com/camel-
> xsd-tp5760376p5760396.html
> Sent from the Camel - Users mailing list archive at Nabble.com.