1

型から取得したXMLからデータを解析しようとしていますClob。なんらかの理由で、この例外が発生しています...理由がわかりません。XMLType値、つまりXMLを含むOracleデータベース列からClobを取得しました。XMLTypeから型に含まれるXMLを正常に抽出しましたClob。これは、次のコードで取得されます。

xmlBean =  XmlHelper.xPathRead(film.getXmlClob());

必要に応じてfilmオブジェクトはモデル内にあり、getXmlClob()メソッドはClobXPathを使用して解析するXMLを含む値を返します。残りのコードは次のとおりです。

XMLHelper

public static XmlBean xPathRead(Clob xmlClob) {
    XPathReader reader = new XPathReader(xmlClob);
    XmlBean xmlBean = new XmlBean();   // just an entity from the model to store the xml's contents inside

    String filmId = "/IMAGE[1]/@id";
    xmlBean.setFilmId(Integer.parseInt((String) reader.read(filmId, XPathConstants.STRING)));
}

XPathReader

public class XPathReader {
    private String xmlString;
    private XPath xPath;

    public XPathReader(Clob xmlClob) {

        try {
            if ((int) xmlClob.length() > 0) {  
                String s = xmlClob.getSubString(1, (int) xmlClob.length()); // this is a way to cast a CLOB into a STRING
                this.xmlString = s;
              }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        xPath = XPathFactory.newInstance().newXPath();
    }

    public Object read(String expression, QName returnType) {
        try {
            XPathExpression xPathExpression = xPath.compile(expression);
            return xPathExpression.evaluate(xmlString, returnType);
        } catch (XPathExpressionException ex) {
            ex.printStackTrace();
            return null;
        }
    }
}

何か案は?問題はevaluate()メソッドにあります...

エラーメッセージ

java.lang.ClassCastException:java.lang.Stringは、com.sun.orgのcom.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.eval(不明なソース)のorg.w3c.dom.Nodeにキャストできません。 .apache.xpath.internal.jaxp.XPathExpressionImpl.eval(Unknown Source)at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.evaluate(Unknown Source)at helper.XPathReader.read(XPathReader.java:34 )helper.XmlHelper.xPathRead(XmlHelper.java:325)で

4

1 に答える 1

1

とにかく文字列からそれを行うことはできません。

このようなものはどうですか

public class XPathReader {
  private XPath xPath;
  private Document doc;

  public XPathReader(Clob xmlClob) {

    try {
        if ((int) xmlClob.length() > 0) {  
            String s = xmlClob.getSubString(1, (int) xmlClob.length()); // this is a way to cast a CLOB into a STRING
            doc = readDoc(s);
          }
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    xPath = XPathFactory.newInstance().newXPath();
}

public Object read(String expression, QName returnType) {
    try {
        XPathExpression xPathExpression = xPath.compile(expression);
        return xPathExpression.evaluate(doc, returnType);
    } catch (XPathExpressionException ex) {
        ex.printStackTrace();
        return null;
    }
}

public Document readDoc(String s)
{
    Document d = null;
    try
    {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        InputSource is = new InputSource(new StringReader(s));
        d = builder.parse(is);
    } catch (Exception e)
    {
    }
    return d;
}

}

私は実際にそれを試していません、そしてあなたはより良いエラー処理を必要とします、しかしそれはうまくいくはずです

于 2012-07-31T13:16:37.823 に答える