#java #xml #xslt #soap #xsd
#java #xml #xslt #soap #xsd
Вопрос:
У меня есть данные XML с конвертом SOAP, но мои схемы XSD могут проверять только данные XML внутри конверта. Я с нетерпением жду механизма, с помощью которого я смогу редактировать XSD и проходить и проверять только тот xml, который находится внутри конверта.
Например, в XSLT мы получаем возможность установить корневой параметр <xsl:template match="*:MsgHeader">
, а не <xsl:template match="*:Envelope">
Ответ №1:
Как вы предлагаете, выполнение проверки в XSLT (2.0 ) является одним из вариантов, но, вероятно, не очень хорошим, потому что XSLT останавливается после первой ошибки проверки.
Если вы используете Saxon в качестве механизма проверки, вы можете выполнить требуемую проверку из Java следующим образом:
Processor p = new Processor(true);
SchemaManager sm = p.getSchemaManager();
sm.load(new StreamSource(new File('schema.xsd')));
SchemaValidator sv = sm.newSchemaValidator();
DocumentBuilder db = p.newDocumentBuilder();
XdmNode doc = db.build(new StreamSource(new File('source.xml')));
XdmNode target = (XdmNode)doc.select(descendant("payload")).findFirst().get();
sv.validate(target.asSource());
Комментарии:
1. Да, решение звучит неплохо. Но я надеялся внести минимальные / нулевые изменения в код и решить его, используя только файлы XSD (поскольку некоторые xml могут не иметь такого запроса). Если вы можете предложить какой-либо механизм, который можно использовать для обхода SOAP envelope путем внесения изменений в сам XSD, было бы действительно здорово. Еще раз спасибо за быстрый ответ и изменения кода.
2. Разве вы не можете просто добавить схему для пространства имен SOAP envelope в микс?
3. Да, не совсем импорт SOAP envelope, я решил это, создав другой xsd с определенной здесь схемой, а затем импортировал свой основной xsd, заменив строку № 62. Спасибо за вашу помощь