2013-07-09 11 views
1

В настоящее время я работаю над программой, которая берет значение «типа данных», выбранного из поля со списком (через .getSelectedIndex()), а затем сверлит вниз «первую запись» и возвращает его как Строковый массив.NodeList не заполняется

Комбинированный ящик заполняется одним и тем же файлом XML, и я кодирую на Java с помощью парсера DOM.

XML фрагмент кода:

<?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» равен 0, как «firstChildren».

Почему он не может передать значение от одного нодлиста к другому? Что мне не хватает?

Любые советы будут оценены.

ответ

2

Ваша структура XML не соответствует тому, что вы ожидаете от кода. Ваш код, кажется, ожидает иерархическую ввод X, где каждый 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> 

Я вижу два решения:

  • Fix структуру вашего ввода XML, чтобы быть иерархическими , как и ваш код.
  • Исправьте свой код для работы с «плоским» стилем (хотя я не думаю, что это то, что вы хотите).
+0

Ох. Мои. Не могу поверить, что я пропустил это! Я смотрел на эту глупую вещь в течение недели, пытаясь понять это! Да, конечно! Ах спасибо, спасибо! Вот так! Я пошел с первым предложением о том, чтобы моя структура XML была иерархической. –

+0

@senex_subconscious Добро пожаловать. Возможно, вы захотите попросить о помощи немного раньше в следующий раз, не нужно зацикливаться на ней целую неделю. :-П –