Вставка элемента в XML в последовательности в порядке, заданном схемой - PullRequest
3 голосов
/ 12 января 2012

У нас большой рабочий процесс программ, которые анализируют данные в файлы XML.У нас есть около 14 схем, каждая из которых имеет другой корень и состоит из около 60 файлов XSD.Некоторые из схем имеют сходные элементы, но схемы в настоящее время модифицируются еженедельно.

У меня есть этап (написанный на Java), который принимает файл XML (который может соответствовать любой из 14 схем) и считывает список кортежей (xpaths, message) и для каждого элемента флага xpath a flagвставляется под элементом, определенным xpath, содержащим сообщение.

<default:flag issueDateTime="2012-01-10T21:00:09" recipient="lablabla" resolvedIndicator="false" sender="SS" xmlns:default="default">
  <default:flagSubject/>
  <default:message>
    <default:p>This element should be non empty</default:p>
  </default:message>
</default:flag>

Мой текущий подход состоял в том, чтобы вставить элемент flag как последний дочерний элемент узла, на который ссылается xpath, который вызывает проблему.В некоторых схемах указанный узел принимает элемент флага в последовательности в порядке, определенном xsd (может быть серединой, первым или последним), поэтому добавление его в качестве последнего элемента делает xml недействительным, когда элемент уже имеет подэлементы из этой последовательности.

Мой вопрос: как добавить элемент в последовательность таким образом, чтобы он соответствовал определенному порядку XSD?

Я сейчас занимаюсь этим

Element flag = rawXmlDoc.createElementNS("default", "default:flag");
xpath = factory.newXPath();
xpath.setNamespaceContext(nsContext);
XPathExpression expr = xpath.compile(xpathText);
Element refNode = (Element)expr.evaluate(rawXmlDoc, XPathConstants.NODE);
if (refNode.getNodeType()==Node.ELEMENT_NODE)
    refNode.appendChild(flag);
else 
    refNode.getParentNode().appendChild(flag);

Я надеюсь получить ответ, используя стандартный интерфейс DOM, не полагаясь на MOXy.

1 Ответ

0 голосов
/ 26 января 2012

Почему вы не используете JAXB?Когда вы используете JAXB вместе с XJC, вы можете

  • генерировать классы Java из ваших XSD-файлов
  • использовать JAXB для демонтажа XML в объекты Java
  • манипулировать XMLс Java
  • снова используйте JAXB, чтобы разархивировать объекты Java в действительный XML

Это использует стандартные API Java XML, но не напрямую DOM.Однако JAXB содержится в каждом JDK, поэтому у вас нет дополнительных зависимостей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...