java处理与文本内联的xml元素

xfyts7mz  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(367)

我有一个程序,它使用javadom读取xml文件并处理某些元素。例如,下面是我正在查看的文档的一部分:

<Flow>
        <Id>306</Id>
        <Type>Simple</Type>
        <FlowContent Width="0.2000000000000000111">
          <P Id="523"><T xml:space="preserve" Id="652">A spouse’s pension would be paid equal to&#x20;<O Id="351"/>% of your Core pension at date of death.</T>
          </P>
        </FlowContent>

(注意:这是从一个名为gmc inspire designer的程序导出的,因此我无法控制其格式。)
我可以很好地处理大多数元素,但是文本内容也包含元素。在上面的示例中,另一个布局对象 <O Id="351"/> (引用另一段文本或变量)出现在正文中。
我可以查找这个元素并使用id号检索它。这是上面代码段中链接的元素:

<Variable>
    <Id>351</Id>
    <Name>CAMT44</Name>

然后,我想做的是从链接节点输出信息(例如,我可以查找id为351的节点并检索名称等,然后在字符串中元素出现的位置显示该信息)。
我当前查找子项并将id存储在字符串数组中,如下所示:

NodeList nl = e.getElementsByTagName("O");
sa = new String[nl.getLength()]; // Set up new array to hold child ids

for (int i = 0; i < nl.getLength(); i++) {
    sa[i] = nodeToElement(nl.item(i)).getAttribute("Id");
}

我是一个java初学者,所以我一直在想dom是否是这个项目的正确选择。也许我应该改用sax,但是由于我没有太多xml经验,我不确定哪一个最适合我的需要,而且,正如我所提到的,我已经成功地完成了我需要的大部分事情,这只是我所坚持的最后一点技巧。
当前我的输出如下所示:
如果cr.scheme==“exct”打印:
“配偶的养老金将在死亡之日支付相当于你核心养老金的%,忽略了你可能选择在退休时将部分养老金转换为一次性养老金的事实。”
子流:351
如果有某种方法可以使用dom来实现这一点,那就太好了。抱歉,如果有什么不清楚的,我是新来的。

8yparm6h

8yparm6h1#

你应该可以这样做:

String output = "";
    for (int i = 0; i < nl.getLength(); i++) {
        Node n = nl.item(i);
        if(n.getNodeType() == Node.TEXT_NODE) {
            output += n.getTextContent();
        } else if (n.getNodeType() == Node.ELEMENT_NODE && n.getNodeName().equals("O")) {
            output += lookup(doc, ((Element)n).getAttribute("id"));

        }
    }
    System.out.println(output);

查找方法是您需要自己实现的方法,但它看起来是这样的:

private static String lookup(Document doc, String id) {
    return "<IMPLEMENT_LOOKUP_HERE>";
}

相关问题