-3

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

返回一个空值..

任何帮助都会很有用

4

1 回答 1

2

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

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

org.w3c.dom.DocumentJava 编程访问从未如此轻松。也许,这就是为什么我们有像 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>");
    }
}

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

于 2013-06-09T14:21:11.443 回答