Ошибка XPath -> [Фатальная ошибка]: 1: 1: содержимое не разрешено в прологе - PullRequest
0 голосов
/ 24 ноября 2011

Я написал приведенную ниже программу, но когда она выходит из классов XPath, она выдает [Фатальная ошибка]: 1: 1: Содержание не разрешено в прологе. Я пытался выяснить это, но не смог сделать есть ли какой-нибудь ключ к решению этой проблемы?

package xpath;

import com.sun.org.apache.xalan.internal.xsltc.trax.SAX2DOM;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import javax.xml.xpath.XPathVariableResolver;
import org.ccil.cowan.tagsoup.Parser;
import org.w3c.dom.Node;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXNotRecognizedException;
import org.xml.sax.SAXNotSupportedException;

public class XPath {
    private static int seg;

         private static void check(Node node) throws XPathExpressionException {
          if (node == null || node.getNodeName() == null)
    return;


  TFIDF( node.getNodeValue(),"java");
  check(node.getFirstChild());
if(node.getFirstChild()==null &&node.getNextSibling()==null)
     seg++;
System.out.println(node.getNodeValue() != null && node.getNodeValue().trim().length() == 0 ? "" : node);
    check(node.getNextSibling());
    }





    public static void main(String[] args) throws MalformedURLException, SAXNotRecognizedException, SAXNotSupportedException, ParserConfigurationException, IOException, SAXException, XPathExpressionException {


             Parser p = new Parser();
        SAX2DOM sax2dom = null;
   org.w3c.dom.Node doc  = null;

       URL url = new URL("http://stackoverflow.com/questions");

   p.setFeature(Parser.namespacesFeature, false);
   p.setFeature(Parser.namespacePrefixesFeature, false);
   sax2dom = new SAX2DOM();
   p.setContentHandler(sax2dom);
   p.parse(new InputSource(new InputStreamReader(url.openStream())));
   doc = sax2dom.getDOM();

    Node html=doc.getFirstChild();
    check(html);

    }

    private static void TFIDF(String segment,  String keyword) throws XPathExpressionException {
  if (segment!=null)
  {
InputSource src = new InputSource(new StringReader(segment));

    final String term = keyword;
String expression = "//*[contains(text(),$term)]";
final QName termVariableName = new QName("term");
class TermResolver implements XPathVariableResolver {
  @Override
  public Object resolveVariable(QName variableName) {
    return termVariableName.equals(variableName) ? term : null;
  }
}
        javax.xml.xpath.XPath xpath = XPathFactory.newInstance().newXPath();
xpath.setXPathVariableResolver(new TermResolver());
Node node = (Node) xpath.evaluate(expression, src, XPathConstants.NODE);

  }

    }
}

1 Ответ

1 голос
/ 24 ноября 2011

Ошибка «Содержимое запрещено в прологе» обычно означает, что у вас есть что-то перед первым XML-элементом в вашем документе, часто с пробелами. Так как вы захватываете http://stackoverflow.com/questions, я думаю, что это символ новой строки после <!doctype>, который вызывает проблему. В соответствии со спецификацией XML пробел должен быть разрешен в прологе как до, так и после типа документа, но многие инструменты не обрабатывают это правильно.

Попробуйте вручную удалить пробел и посмотрите, поможет ли это. Если нет, попробуйте полностью удалить объявление doctype.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...