#xml #design-patterns #apache-commons-digester
#xml #шаблоны проектирования #apache-commons-digester
Вопрос:
Я пытаюсь использовать Apache Digester (V3) для обработки XML-файла, который содержит ‘дампы потоков’: таким образом, файл содержит много дампов потоков, один дамп потока содержит много потоков, а один поток содержит трассировку стека, которая состоит из многих строк
Вот так: (упрощенный)
<threaddumps>
<threaddump name="xxx">
<thread name="thread-1">
<stacktrace>
<line>
java.lang.wait
</line>
<line>
...
</line>
</stacktrace>
</thread>
<thread name="thread-2">
...
</threaddump>
<threaddump name="yyy">
...
</threaddumps>
Я использую правило на основе XML для обработки этого входного файла; фрагмент ниже:
<pattern value="thread">
<object-create-rule classname="mypackagemodel.Thread"/>
<set-next-rule methodname="addThread" paramtype="mypackagemodel.Thread"/>
<set-properties-rule>
<alias attr-name="name" prop-name="name" />
</set-properties-rule>
<pattern value="stacktrace/line">
<object-create-rule classname="mypackagemodel.StackLine"/>
<set-next-rule methodname="addStackLine" paramtype="mypackagemodel.StackLine"/>
<!-- need something here -->
</pattern>
</pattern>
Как мне извлечь этот текст из промежуточных тегов ‘line’? Я уже сопоставляю ‘stacktrace / line’, нет подэлемента для использования — так какой шаблон я могу использовать?
Другой способ выразить это — объект ‘StackLine’ создается и ассоциируется правильно — просто я не знаю, как вызвать мой установщик ‘setName ()’?
(В XSLT обычно используется ‘.’ или ‘current ()’, например, в аналогичном сценарии)
Ответ №1:
Понял: по-видимому, пустая строка шаблона будет соответствовать тексту текущего узла:
Это сработало для меня:
<bean-property-setter-rule pattern="" propertyname="line"/>