【问题标题】:Java Sax mysterious [closed]Java Sax 神秘[关闭]
【发布时间】:2013-06-05 06:37:20
【问题描述】:

我有这个 xml:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="new2.xsl"?>
<patients>
    <patient>
        <stoixeia_astheni>
            <arithmos_eksetasis>1</arithmos_eksetasis>
            <imerominia_eksetasis>xxx</imerominia_eksetasis>
            <amka>14385</amka>
            <surname>??µ?t????</surname>
            <name>Ga?????</name>
            <onoma_patros>??a??????</onoma_patros>
            <imgennisis>15/03/1984</imgennisis>
            <diagnosi>G??p?</diagnosi>
            <famagogi>depon</famagogi>
        </stoixeia_astheni>
        <stoixeia_epikoinonias>
            <dieuthinsi>xxxxx</dieuthinsi>
            <takodikas>xxxxx</takodikas>
            <perioxi>xxxx</perioxi>
            <stathero>xxxxx</stathero>
            <kinito>-</kinito>
        </stoixeia_epikoinonias>
        <loipa_stoixeia>
            <fylo>A??e?</fylo>
            <oikkatastasi>?a?t?eµ????</oikkatastasi>
            <epaggelma>??e????</epaggelma>
            <istoriko>-</istoriko>
            <sxolia>-</sxolia>
        </loipa_stoixeia>
    </patient>
</patients>

我正在尝试使用以下代码进行搜索:

try {
    NodeList nl = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
    for(int i =0;i<nl.getLength();i++) {
        Node n = nl.item(i); 
        pw.println("<tr><td colspan=\"2\"><h2>Στοιχεία ασθενή</h2></td></tr>");
        for(int j=1;j<=9;j=j+1){
            pw.println("<tr>");
            pw.println("<td>"+ellhnika[j]+"</td>");
            pw.println("<td>"+n.getParentNode().getParentNode().getParentNode().getChildNodes().item(1).getChildNodes().item(j).getTextContent()+"</td>");
            pw.println("</tr>");
        }
        pw.println("<tr><td colspan=\"2\"><h2>Στοιχεία επικοινωνίας</h2></td></tr>");
        for(int j=10;j<=15;j++){
            pw.println("<tr>");
            pw.println("<td>"+ellhnika[j]+"</td>");
            pw.println("<td>"+n.getParentNode().getParentNode().getParentNode().getChildNodes().item(1).getChildNodes().item(j).getTextContent()+"</td>");
            pw.println("</tr>");  
        }
        pw.println("<tr><td colspan=\"2\"><h2>Λοιπά στοιχεία</h2></td></tr>");
        for(int j=16; j<=19;j++){
            pw.println("<tr>");
            pw.println("<td>"+ellhnika[j]+"</td>");
            pw.println("<td>"+n.getNodeName()+"</td>");
            pw.println("</tr>");
        } 
    }
    pw.println("</table></body></html>");
} catch (XPathExpressionException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

问题是当第一个(三个中的)循环运行时,我显示如下:

<tr>
    <td>Αριθμός εξέτασης</td>
    <td>1</td>
</tr>
<tr>
    <td>Ημερομηνία εξέτασης</td>
    <td>
        </td>
</tr>

所以对于 j 的奇数值

n.getParentNode().getParentNode().getParentNode().getChildNodes()
 .item(1).getChildNodes().item(j).getTextContent()

返回一个空值..

任何帮助都会很有用

【问题讨论】:

  • 请不要将大量代码转储到 Stack Overflow。相反,请投入一些精力将其简化为最简单的测试用例。
  • @OliCharlesworth 我的朋友,我不知道错误在哪里,只显示最简单的测试用例..你能帮帮我吗?
  • 然后从逐步简化输入数据开始,逐步简化代码逻辑。继续,直到你有 15 行代码,然后重新发布。
  • 你试过使用调试器吗?
  • 这不是调试服务。如果除了您之外没有人对我们的答案感兴趣,那么您的问题不适合本网站。

标签: java xml-parsing sax


【解决方案1】:

仔细观察你的程序输出。你会注意到两件事:

  • 您似乎遇到问题的是 偶数 行(这并不奇怪)
  • 您的子节点没有跳过(第 2 个节点出现在第 3 位)

org.w3c.dom.Document 从来没有让自己轻松地进行 Java 编程访问。也许,这就是为什么我们有像 JDOM 这样的 API 来简化 XML 数据访问的原因。其中一个特点是文本内容本身是一个单独的Node,并且它还包含空格

因此,虽然您似乎认为您只有 9 个子节点(通过您的 for 循环条件明显),但实际上您有 18 个子节点,包括表示您所在的其他节点之间的空白的文本节点实际上对打印的值感兴趣。

所以,打印你的文本节点如下

// fetch your child nodes just ONCE; outside the loop
NodeList childNodes = n.getParentNode().getParentNode().getParentNode()
                      .getChildNodes().item(1).getChildNodes();

// iterate over the complete list; DON'T hardcode the num of children here
for (int j = 0; j < childNodes.getLength(); j++) {
    String textContent = null;

    // trim to eliminate whitespace nodes
    if (!(textContent = childNodes.item(j).getTextContent().trim()).isEmpty()) {
        System.out.println("<tr>");
        System.out.println("<td>" + ellhnika[j] + "</td>");
        System.out.println("<td>" + textContent + "</td>");
        System.out.println("</tr>");
    }
}

对其余循环执行相同操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 2012-09-03
    • 2013-07-14
    相关资源
    最近更新 更多