【问题标题】:NodeList not populating节点列表未填充
【发布时间】:2013-07-09 18:20:33
【问题描述】:

我目前正在开发一个程序,该程序采用从组合框中选择的“数据类型”的值(通过 .getSelectedIndex()),然后向下钻取“第一条记录”并将其作为字符串数组返回。

组合框由相同的 XML 文件填充,我正在使用 DOM 解析器在 Java 中进行编码。

XML 代码 sn-p:

    <?xml version="1.0" encoding="UTF-8"?>
   <dealershipParsers>
<Parser id="ADPParser2">
    <data type="Sales" />
        <first record = "DEAL-NO"/>        
    <data type="Service" />
        <first record ="RO"/>                
    <data type="Email" />
        <first record ="CONTROL"/>        
</Parser>

我目前用来尝试获取和返回“第一条记录”的 Java 代码:

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder docBuilder = factory.newDocumentBuilder();
    Document document = docBuilder.parse(fileName);

    //Searches all text 
    document.getDocumentElement().normalize();

    //Gets elements from xml 

    Element elementArray = document.getDocumentElement();
    NodeList listResources = elementArray.getElementsByTagName("Parser");

    Element elemChild = (Element) listResources.item(item);      
    NodeList dataChildren =  elemChild.getElementsByTagName("data"); 

    Element elemFirst = (Element) dataChildren.item(item);
    NodeList firstChildren = elemFirst.getElementsByTagName("first");

    int tam = firstChildren.getLength();
    String[] vecResources = new String[tam];

    for (int i = 0; i < tam; i++) 
    {
       Element elem = (Element) firstChildren.item(0);      
       vecResources[i] =  elem.getAttribute("record"); // change to type
    }        

    //returns an array with all the types of data
    return vecResources;

我已经设法确定了我的问题是在“dataChildren”、“elemFirst”和“firstChildren”之间的某个过渡处。 “dataChildren”中有一个计数,但是当我在 netbeans 中进行调试时,它显示“tam”和“firstChildren”一样等于 0。

为什么不能将值从一个节点列表传递到另一个节点列表?我错过了什么?

任何建议将不胜感激。

【问题讨论】:

    标签: java xml dom getelementsbytagname xmlnodelist


    【解决方案1】:

    您的 XML 结构与您的代码“预期”不匹配。您的代码似乎需要一个分层的 XML 输入,其中每个 Parser 包含 data 节点,每个 data 包含 first 节点:

    <Parser id="ADPParser2">
        <data type="Sales">
            <first record="DEAL-NO" />
        </data>
        <data type="Service">
            <first record="RO" />
        </data>
        <data type="Email">
            <first record="CONTROL" />
        </data>
    </Parser>
    

    但是,您的 XML 输入是平面的:data 和 first 节点是Parser 的直接子节点。您的缩进似乎暗示了其他情况(这可能导致了这种混乱),但它实际上等同于:

    <Parser id="ADPParser2">
        <data type="Sales" />
        <first record="DEAL-NO" />
        <data type="Service" />
        <first record="RO" />
        <data type="Email" />
        <first record="CONTROL" />
    </Parser>
    

    我可以看到两种解决方案:

    • 将 XML 输入的结构修复为分层结构,就像您的代码所期望的那样。
    • 修复您的代码以使用“扁平”样式(尽管我认为这不是您想要的)。

    【讨论】:

    • 哦。我的。我不敢相信我错过了!我已经盯着这个愚蠢的东西看了一个星期,试图弄清楚!是的当然!啊谢谢谢谢!做到了!我的第一个建议是将我的 XML 结构修复为分层结构。
    • @senex_subconscious 不客气。下次您可能想早一点寻求帮助,无需为此纠结一整周。 :-P
    猜你喜欢
    • 2014-09-03
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2013-01-24
    相关资源
    最近更新 更多