Java Sax神秘莫测

时间:2013-06-09 12:50:27

标签: java xml-parsing sax

我有这个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()

返回一个空值..

任何帮助都是有用的

1 个答案:

答案 0 :(得分:2)

仔细观察您的节目输出。你会注意到两件事:

  • 甚至行(并不奇怪)你似乎遇到了问题
  • 您的子节点 跳过(第二个节点显示在第三位)

org.w3c.dom.Document从未轻易地适用于Java编程访问。也许,这就是为什么我们有像JDOM这样的API来简化XML数据访问。其中一个特点是文本内容本身就是一个单独的Node,它还包含 空格

所以,虽然你似乎认为你只有九个子节点(显然是你的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>");
    }
}

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