Существует ли библиотека Java для проверки того, что фрагмент XML является подмножеством файла XML большего размера? - PullRequest
3 голосов
/ 25 ноября 2010

Я ищу код, который может сделать следующее.С учетом фрагмента XML произнесите:

<c>Some text</c>

и полный файл XML:

<a>
   <b>
      <c>Some text</c>
   </b>
</a>

проверьте, что фрагмент действительно является допустимым подмножеством полного файла XML.Я смотрел на XMLUnit , который выглядит действительно хорошо, но, похоже, он проверяет только полные файлы друг против друга.

В приведенном выше примере сработало бы простое сравнение строк, но другие функции, которые я хотел бы поддержать, могли бы быть:

1) Порядок дочерних элементов не важен.Например,

<b>
   <c>Some text</c>
   <d>Other text</d>
</b>

является допустимым подмножеством

<a>
   <b>
      <d>Other text</d>
      <c>Some text</c>
   </b>
</a>

2) Игнорировать пробелы, табуляции, новые строки и т. Д.
3) Приятно было бы использовать скелетную функцию XMLUnit, гдеИмена узлов и структура проверяются, но не значения содержимого.Например, <c>Some text</c> будет действительным при сравнении с <c>Other text</c>.

1 Ответ

1 голос
/ 24 января 2011

Я не думаю, что есть такая библиотека, но вы можете решить ее следующим образом (если ваш xml-фрагмент начинается с элемента). Я предполагаю, что вы знакомы с XMLUnit.

public boolean isSubset(Document document, Element element) {
    NodeList list = document.getElementsByTagName(element.getNodeName());
    for (int i = 0; i < list.getLength(); i++) {
        Element el = (Element) list.item(i);
        Document clone = toNewDocument(el);
        //compare element with clone with XMLUnit
        //...
        if (equal) {
            return true;
        }
    }
    return false;
}

private Document toNewDocument(Element el) {
    // createing a new DOM-document...
    Document document = documentBuilder.newDocument();
    Node node = document.importNode(el, true);
    document.getDocumentElement().appendChild(node);
    return document;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...