我目前正在尝试为一些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


当我尝试将'target'强制转换为Element时,我想这是因为它是一个“内联”标签,但作为解析的初学者,我不知道如何处理它。

谢谢你的帮助,

赫维

编辑:我尝试通过用getElementsByTagName替换getChildNodes,它似乎可以工作...但是,如果有人可以更正上面的代码或至少说明为什么它不能正常工作,那真是太棒了。

最佳答案

简而言之,您错误地假设getChildNodes()仅返回XML Element;不会,它也会返回其他类型的节点,包括表示空白的文本节点和您感兴趣的元素之间的换行符。

如果要调用getChildNodes()并处理所有节点,则需要遍历所有返回的节点,并查看每个节点以确定它是哪种节点,并进行相应处理。如果您不想执行此操作,则可以选择getElementsByTagName()之类的方法。

07-26 05:57