Java SaxParser在&;之后修剪字符串;amp;

Java SaxParser在&;之后修剪字符串;amp;,java,xml,parsing,Java,Xml,Parsing,我想解析此xml: <sparql xmlns="http://www.w3.org/2005/sparql-results#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/sw/DataAccess/rf1/result2.xsd"> <head> <variable name="uri"/> <

我想解析此xml:

<sparql xmlns="http://www.w3.org/2005/sparql-results#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/sw/DataAccess/rf1/result2.xsd">
 <head>
  <variable name="uri"/>
  <variable name="id"/>
  <variable name="label"/>
</head>
<results distinct="false" ordered="true">
<result>
  <binding name="uri"><uri>http://dbpedia.org/resource/Davis_&amp;_Weight_Motorsports</uri></binding> 
  <binding name="label"><literal xml:lang="en">Davis &amp; Weight Motorsports</literal></binding>
  <binding name="id"><literal datatype="http://www.w3.org/2001/XMLSchema#integer">5918444</literal></binding>
  <binding name="label"><literal xml:lang="en">Davis &amp; Weight Motorsports</literal></binding>
</result></results></sparql>
正如你所看到的,它与&

当我遍历character()函数时,我发现长度是错误的,并且达到了&而不是我想要得到的字符串的末尾

我复制了这部分代码,对解析器和处理程序了解不多,我只知道从跟踪代码中得到的很多信息,无论我在哪里搜索,都会说应该有
&而不是&这里就是这种情况


在这段代码中,我应该怎么做才能使完整的字符串不被&character修剪?

这是每个人在使用SAX时都必须学习的一个教训:解析器可以分解文本节点,并在多次调用characters()时报告内容,应用程序的工作是重新组装它(例如,通过使用StringBuilder)。对于解析器来说,在任何需要在内存中分流字符的位置(例如,实体引用发生的位置或它到达I/O缓冲区边界的位置)断开文本是非常常见的

它是这样设计的,通过最小化文本复制,使SAX解析器变得超级高效,但我怀疑这并没有真正的好处,因为文本复制只能由应用程序来完成


不要像@DavidWallace所建议的那样,对解析器进行二次猜测。解析器可以按自己喜欢的方式分解文本,您的应用程序应该满足这一要求。

请发布您正在解析的xml进行测试。我唯一能看到的问题是,一些xml解析器可能会为单个元素的内容提供多个
字符
事件。我建议使用调试器,在
characters
方法中设置断点,以确定是否发生了这种情况。如果是这样的话,那么你必须让你的
字符
方法累积文本,直到调用
endElement
方法。你是对的。我怎么知道我是否需要积累这种情况?如我所建议的,在startelement和endelement中设置开关是否合理。使用调试器,在
characters
中设置断点,查看调试器被调用的次数以及使用的字符。这会告诉你是否需要积累。如果这不是问题所在,那么我不确定该提出什么建议;但这是一件好事,首先尝试一下。为什么它不起作用呢?如果要启动的标记是
,则只应将空字符串放入
tempBinding
。如果您这样做,那么实际的逻辑正是您现在拥有的逻辑。这就是使堆栈溢出非常好的原因。你问了一个关于SAX解析的问题,Michael Kay给了你答案。世界上还有其他网站发生这种事情吗?
public class DBpediaLookupClient extends DefaultHandler{

public DBpediaLookupClient(String query) throws Exception {
    this.query = query;
   HttpMethod method = new GetMethod("some_uri&query=" + query2);
    try {         
      client.executeMethod(method);       
      InputStream ins = method.getResponseBodyAsStream();
      SAXParserFactory factory = SAXParserFactory.newInstance();
      SAXParser sax = factory.newSAXParser();
      sax.parse(ins, this);


    } catch (HttpException he) {
      System.err.println("Http error connecting to lookup.dbpedia.org");
    } catch (IOException ioe) {
      System.err.println("Unable to connect to lookup.dbpedia.org");
    }
    method.releaseConnection();
  }

public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {      
    if (qName.equalsIgnoreCase("td") || qName.equalsIgnoreCase("uri") || qName.equalsIgnoreCase("literal")) {
      tempBinding = new HashMap<String, String>();
    }
    lastElementName = qName;
  }

  public void endElement(String uri, String localName, String qName) throws SAXException {     
    if (qName.equalsIgnoreCase("uri") || qName.equalsIgnoreCase("literal") || qName.equalsIgnoreCase("td")) {
      if (!variableBindings.contains(tempBinding))
        variableBindings.add(tempBinding);
    }
  }

  public void characters(char[] ch, int start, int length) throws SAXException {
    String s = new String(ch, start, length).trim();
    if (s.length() > 0) {
      if ("td".equals(lastElementName)) {
        if (tempBinding.get("td") == null) {
          tempBinding.put("td", s);
        }           
      }

      else if ("uri".equals(lastElementName)) {
            if (tempBinding.get("uri") == null) {
                  tempBinding.put("uri", s);
                }
      }
      else if ("literal".equals(lastElementName)) {
            if (tempBinding.get("literal") == null) {
                  tempBinding.put("literal", s);
                }
      }
      //if ("URI".equals(lastElementName)) tempBinding.put("URI", s);
      if ("URI".equals(lastElementName) && s.indexOf("Category")==-1 && tempBinding.get("URI") == null) {
        tempBinding.put("URI", s);
      }
      if ("Label".equals(lastElementName)) tempBinding.put("Label", s);
    }
  }
}
key: uri, value: http://dbpedia.org/resource/Davis_
key: literal, value: 5918444
key: literal, valueDavis