В настоящее время я пытаюсь написать простой синтаксический анализатор для некоторых файлов 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, и, похоже, это работает... Однако, если бы кто-то мог исправить приведенный выше код или хотя бы объяснить, почему он не будет работать должным образом, это было бы здорово.