处理与文本内联的XML元素

时间:2017-01-03 14:50:17

标签: java xml dom

我有一个程序,它使用Java DOM读取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 ==&#34; EXCT&#34; PRINT:

     

&#34;配偶的养老金将等于您的核心养老金的百分比   死亡日期,忽略了你可能选择转换的事实   退休后一部分养老金一次性支付。&#34;

     

子流:351

如果使用DOM有一些方法可以做到这一点会很棒。抱歉,如果有什么不清楚的话,我对此大部分内容都不熟悉。

1 个答案:

答案 0 :(得分:0)

你应该可以这样做:

    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>";
}