Парсер Java DOM: XMI — встроенный тег?

В настоящее время я пытаюсь написать простой синтаксический анализатор для некоторых файлов XMI (сгенерированных из диаграммы UML), но я сталкиваюсь с некоторыми проблемами, когда пытаюсь извлечь целевой xmi.idref из этого фрагмента кода (я хочу получить связанные элементы с заданным активность, я успешно получил все входящие/исходящие ребра):

<UML2:ActivityEdge xmi.id = 'I6bf577d1m1387a6c0ea1mm7dcb' visibility = 'public' is Specification = 'false'>
    <UML2:ActivityEdge.target>
        <UML2:CallAction xmi.idref = 'I6bf577d1m1387a6c0ea1mm7dda'/>
    </UML2:ActivityEdge.target>

Моя проблема в том, что когда я пытаюсь извлечь UML2:CallAction, моя программа определяет его не как узел элемента, а как текстовый узел, который, кстати, пуст. Вот пример того, что я делаю:

Element edge = searchById(doc,"UML2:ActivityEdge",id);
        Element group = (Element) edge.getElementsByTagName("UML2:ActivityEdge.target").item(0);
        Node target = group.getChildNodes().item(0);
        Element targetRef = (Element) target;
        Element t = searchById(doc,targetRef.getNodeName(),targetRef.getAttribute("xmi.idref"));
        nameList.add(t.getAttribute("name"));

Метод searchById работает (я использую его в различных частях своего кода), но если вы думаете, что это может быть проблемой, я опубликую его. Обратите внимание, что я использую getChildNodes, а не getElementsByTagName, потому что целью этого ребра не всегда может быть действие (например, узел соединения/слияния XOR). Точная ошибка:

com.sun.org.apache.xerces.internal.dom.DeferredTextImpl cannot be cast to org.w3c.dom.Element

Когда я пытаюсь передать «цель» элементу... Я думаю, это связано с тем, что это «встроенный» тег, но я понятия не имею, как с ним обращаться, будучи новичком в анализе...

Спасибо за вашу помощь,

Эрве

Редактировать: я попытался заменить getChildNodes на getElementsByTagName, и, похоже, это работает... Однако, если бы кто-то мог исправить приведенный выше код или хотя бы объяснить, почему он не будет работать должным образом, это было бы здорово.


person anonymous2339901    schedule 30.07.2012    source источник


Ответы (1)


Короче говоря, вы делаете неверное предположение, что getChildNodes() возвращает только XML Element; это не так, он также возвращает другие типы узлов, включая текстовые узлы, которые представляют пробелы и новые строки между интересующими вас элементами.

Если вы хотите вызвать getChildNodes() и обработать все узлы, вам нужно перебрать все возвращенные узлы и просмотреть каждый, чтобы определить, какой это узел, и обработать его соответствующим образом. Если вы не хотите этого делать, альтернативой будет что-то вроде getElementsByTagName().

person Ernest Friedman-Hill    schedule 30.07.2012
comment
Спасибо, только то, что я не понял... Быстрый цикл решил мои проблемы! - person anonymous2339901; 30.07.2012