ошибка: java.lang.String не может быть приведен к org.w3c.dom.Node

Я пытаюсь разобрать строку xml и получаю ошибку java.lang.String cannot be cast to org.w3c.dom.Node.

Это код, который я использую:

        XPathFactory xPathFactory = XPathFactory.newInstance();

        XPath xPath = xPathFactory.newXPath();

        String expression = "//Home/ListOfCustomers";

        XPathExpression xPathExpression = xPath.compile(expression);

        Object nl = xPathExpression.evaluate(xmlResp);

Вот как строится строка XML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<Home>
      <ListOfCustomers type="Regular" count="939">
           <Customer>
            <CustName>xyz</CustName>
           </Customer>
           <Customer>
            <CustName>abc</CustName>
           </Customer>
           <Customer>
            <CustName>def</CustName>
           </Customer>
       </ListOfCustomers>
</Home>

Что мне здесь не хватает?


person Asdfg    schedule 15.03.2012    source источник
comment
@человек-который-проголосовал-против-но-не-заботился-оставить-комментарий: $%#& &*$   -  person Asdfg    schedule 15.03.2012
comment
Осторожно, такие комментарии, скорее всего, принесут вам больше минусов. Не принимайте отрицательных голосов лично, спросите себя, следовали ли вы рекомендациям в faq и Как спросить. Также признайте, что вы получите необъяснимые отрицательные голоса ... это просто природа ТАК.   -  person Jim Garrison    schedule 15.03.2012
comment
Иногда я тоже смущаюсь, чтобы увидеть отрицательный ответ на вопрос с программным кодом. Для меня это все действительные вопросы для софта. :-) в любом случае, мой голос за вас. ваше здоровье.   -  person Jasonw    schedule 15.03.2012
comment
тоже проголосовал.....   -  person Serge Merzliakov    schedule 25.11.2014


Ответы (2)


Объект nl = xPathExpression.evaluate(xmlResp);

Вот в чем проблема. С одним аргументом для оценки метод, он ожидает либо переменную типа InputSource, либо Object, вы объявили xmlResp для любой из них? Кроме того, оба этих метода возвращают тип String, так почему же вы назначаете переменную типа Object?

Поскольку у вас есть файл xml, почему бы вам не инициализировать свой xmlResp для типа InputSource? Затем используйте оценку xPathExpression для источника ввода? Что-то вроде следующего.

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;

import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;


public class XMLParser
{

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        try {

        XPathFactory xPathFactory = XPathFactory.newInstance();
        XPath xPath = xPathFactory.newXPath();

        InputSource doc = new InputSource(new InputStreamReader(new FileInputStream(new File("file.xml"))));

        String expression = "//Home/ListOfCustomers";
        XPathExpression xPathExpression = xPath.compile(expression);

        NodeList elem1List = (NodeList) xPathExpression.evaluate(doc, XPathConstants.NODESET);
        xPathExpression = xPath.compile("@type");

        for (int i = 0; i < elem1List.getLength(); i++)
        {
            System.out.println(xPathExpression.evaluate(elem1List.item(i), XPathConstants.STRING)); 
        }


        }
        catch (XPathExpressionException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
person Jasonw    schedule 15.03.2012
comment
довольно близко. у меня не было xml-файла. это была строка xml. я не преобразовал его в документ сначала. это была ошибка. - person Asdfg; 15.03.2012
comment
@Asdfg Жаль, что вы не дали совета, если у нас есть только строка (например, в службе обмена сообщениями), ее здесь: stackoverflow.com/questions/16712391/ - person pdem; 03.08.2018

Просто бегло просмотрите документы: http://docs.oracle.com/javase/1.5.0/docs/api/javax/xml/xpath/XPathExpression.html#evaluate(java.lang.Объект)

Затем API определяет это для компиляции: item — начальный контекст (например, узел или список узлов).

Итак, предполагая, что это метод, который вы используете, похоже, вам нужно отправить узел или список узлов, а не только строку.

person Matt Harrison    schedule 15.03.2012