【问题标题】:Processing XML elements inline with text处理与文本内联的 XML 元素
【发布时间】:2017-01-03 14:50:17
【问题描述】:

我有一个程序,它使用 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 的程序中导出的,因此我无法控制其格式。)

我可以很好地处理大多数元素,但是对于也包含元素的文本内容有问题。在上面的示例中,另一个布局对象&lt;O Id="351"/&gt;(引用另一段文本或变量)出现在文本正文中。

我可以查找此元素并使用 ID 号检索它。这是上面sn-p中链接的元素:

<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 做到这一点,那就太好了。抱歉,如果有任何不清楚的地方,我对大部分内容都是新手。

【问题讨论】:

  • 您想要实现的目标并不明显。 &lt;O Id="351"&gt; 是否应该被其他以“351”标识的文本替换?
  • 嗨四十二,是的,这就是我想要实现的目标。我将使用此信息更新问题。
  • ¿您在文档中有两个具有相同“id”的元素?

    ?

  • 您好,我是 GMC Inspire Designer 的架构师,仅当只有一个布局模块时,导出的 id 才是唯一的,该模块实际上由名为 Layout 的 XML 元素定义,未在问题中显示。

标签: java xml dom


【解决方案1】:

你应该可以做这样的事情:

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

【讨论】:

    猜你喜欢
    • 2021-09-14
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    相关资源
    最近更新 更多