I에서 표현식을 평가할 수 없습니다. URL에 의해 반환 된 XML 문서를 구문 분석하기 위해 XPath를 사용합니다. 주어진 입력으로 코드를 실행할 때 작동하지만 사용자 입력으로 입력 할 때 예외가 발생합니다. 강령 :XPath
class{
private String generalQuery = "//@*";
method(){
System.out.println("Enter URL");
url = scan.nextLine();
URL oracle = new URL(url);
InputStream is = oracle.openStream();
org.w3c.dom.Document doc = null;
DocumentBuilderFactory domFactory;
DocumentBuilder builder;
try {
domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true);
builder = domFactory.newDocumentBuilder();
doc = builder.parse(is);
} catch (Exception ex) {
System.err.println("unable to load XML: " + ex);
}
Map <String, String> params = new HashMap<String, String>();
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
xpath.setNamespaceContext(new NameSpaces(doc));
XPathExpression expr = xpath.compile(generalQuery);
Object result = expr.evaluate(doc, XPathConstants.NODESET); // exception thrown here
NodeList nl = (NodeList) result;
for (int i = 0 ; i < nl.getLength() ; i++){
Node n = (Node)nl.item(i);
params.put(n.getNodeName(), n.getNodeValue());
}
return params;
}
}
예외 :
javax.xml.transform.TransformerException: Unable to evaluate expression using this context
클래스 네임 스페이스 : 당신이 누락 된 것으로 보인다 무엇
import java.util.Iterator;
import javax.xml.XMLConstants;
import javax.xml.namespace.NamespaceContext;
import org.w3c.dom.Document;
public class NameSpaces implements NamespaceContext {
private Document sourceDocument;
public NameSpaces(Document document) {
sourceDocument = document;
}
@Override
public String getNamespaceURI(String prefix) {
if (prefix.equals(XMLConstants.DEFAULT_NS_PREFIX)) {
return sourceDocument.lookupNamespaceURI(null);
} else {
return sourceDocument.lookupNamespaceURI(prefix);
}
}
@Override
public String getPrefix(String namespaceURI) {
return sourceDocument.lookupPrefix(namespaceURI);
}
@Override
public Iterator<String> getPrefixes(String namespaceURI) {
return null;
}
}
이 코드 조각의'doc' 유형은 무엇입니까? –
dom에 의해 생성 된 XML 문서 –
'NameSpaces' 란 무엇입니까? 'setNamespaceContext' 메쏘드는'NamespaceContext' 타입의 인자를 기대합니다. Ian이 지적했듯이, 당신은 또한 우리에게'doc'의 타입을 말하지 않았습니다. 서면으로, 당신의 질문은 컴파일되지 않을 것이고 당신은 우리가 포함시켜야 할 것들을 짐작할 수 있도록 남겨 두었습니다. –