грешка: 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-who-downvoted-but-didnt-care-to-leave-comment: $%#& &*$   -  person Asdfg    schedule 15.03.2012
comment
Внимавайте, коментари като този вероятно ще ви донесат повече отрицателни гласове. Не приемайте лично отрицателен вот, запитайте се дали сте следвали указанията в често задаваните въпроси и Как да попитам. Също така признайте, че ще получите някои необясними гласове против... това е просто естеството на SO.   -  person Jim Garrison    schedule 15.03.2012
comment
Понякога и аз съм объркан, за да видя гласуване против въпрос с програмен код. За мен всички те са валидни въпроси за sof. :-) както и да е, моята подкрепа за вас. наздраве.   -  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 на inputsource? Нещо като следното.

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 дефинира това за compile: item - Началния контекст (възел или списък с възли, например).

Така че ако приемем, че това е методът, който използвате, изглежда, че трябва да изпратите възел или списък с възли, а не само низ.

person Matt Harrison    schedule 15.03.2012