【问题标题】:Java DOM Parser : XMI - Inline Tag?Java DOM 解析器:XMI - 内联标记?
【发布时间】:2012-07-30 04:22:21
【问题描述】:

我目前正在尝试为一些 XMI 文件(从 UML 图生成)编写一个简单的解析器,但是当我尝试从这段代码 sn-p 中提取目标 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

当我尝试将“目标”转换为元素时......我想这是因为它是一个“内联”标签,但我不知道如何处理它,作为解析的初学者......

感谢您的帮助,

赫维

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

【问题讨论】:

    标签: java dom xmi


    【解决方案1】:

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

    如果你想调用getChildNodes()并处理所有节点,那么你需要遍历所有返回的节点,并查看每个节点以确定它是什么类型的节点,并进行相应的处理。如果您不想这样做,则可以选择 getElementsByTagName() 之类的东西。

    【讨论】:

    • 谢谢,只是我不明白...一个快速循环解决了我的问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    相关资源
    最近更新 更多