【问题标题】:Android - xml ampersand conversionAndroid - xml & 符号转换
【发布时间】:2012-04-14 17:33:52
【问题描述】:

我有一个带有 xml 标记的 sax 解析器,其中包含以下文本:“A & amp; B”(那里没有空格 - 添加因此它不会在此处转换为 &)

就好像它被转换了两次,并且由于“A”的结果而由于&符号而转义。流程如下:

Xml 文件已下载

InputStream _inputStream = _urlConnection.getInputStream();
                        BufferedInputStream _bufferedInputStream = new BufferedInputStream(_inputStream);
                        ByteArrayBuffer _byteArrayBuffer = new ByteArrayBuffer(64);

                        int current = 0;
                        while((current = _bufferedInputStream.read()) != -1)
                        {
                            _byteArrayBuffer.append((byte)current);
                        }

                        FileOutputStream _fileOutputStream = openFileOutput(_file, MODE_PRIVATE);

                        _fileOutputStream.write(_byteArrayBuffer.toByteArray());
                        _fileOutputStream.close();

数据在 endElement 中用 Sax 转换

else if (inLocalName.equalsIgnoreCase(_nodeTitle))
        {
            _titleValue = currentValue;
            currentValue = "";
        }

在调试中,当我在处理程序的字符方法中读取时,与号已经转换并且数据被截断。

我已经看到了很多关于这个的问题,但从来没有一个解决方案。有什么想法吗?

谢谢

解析器:

List<PropertiesList> _theList = null;

        try 
        {
            // Create Factory, Parser, Reader, Handler
            SAXParserFactory _saxParserFactory = SAXParserFactory.newInstance();
            SAXParser _saxParser = _saxParserFactory.newSAXParser();
            XMLReader _xmlReader = _saxParser.getXMLReader();
            HandlerReps _handler = new HandlerReps(inRegion, inAbbreviation);

            _xmlReader.setContentHandler(_handler);
            _xmlReader.parse(new InputSource(inStream));

            _theList = _handler.getTheList();
        } 

处理程序:

// Called when Tag Begins
    @Override
    public void startElement(String uri, String inLocalName, String inQName, Attributes inAttributes) throws SAXException 
    {
        currentElement = false;
    }

    // Called when Tag Ends
    @Override
    public void endElement(String inUri, String inLocalName, String inQName) throws SAXException 
    {
        currentElement = false;

        // Title
        if (inLocalName.equalsIgnoreCase(_nodeValue))
        {
            if (_stateValue.equalsIgnoreCase(_abbreviation) && 
                _countryValue.equalsIgnoreCase(_region))
            {
                // Construct the object
                PropertiesRegion _regionObject = new PropertiesRegion(_titleValue, _address1Value);

                cList.add(_regionObject);

                Log.d(TAG, _regionObject.toString());
            }

            _titleValue = "";
            _address1Value = "";
        }

        // Title
        else if (inLocalName.equalsIgnoreCase(_nodeTitle))
        {
            _titleValue = currentValue;
            currentValue = "";
        }

        // Address1
        else if (inLocalName.equalsIgnoreCase(_nodeAddress1))
        {
            _address1Value = currentValue;
            currentValue = "";
        }
    }

    // Called to get Tag Characters
    @Override
    public void characters(char[] inChar, int inStart, int inLength) throws SAXException 
    {
        if (currentElement) 
        {
            currentValue = new String(inChar, inStart, inLength);
            currentElement = false;
        }
    }

【问题讨论】:

  • 请向我们展示更多实际解析 XML 的代码。从 URL 下载东西到文件很无聊。 :-) 除非你在 openFileOutput() 中做错了什么。此外,这里的下载效率很低,但这是一个不同的问题。简而言之:不要使用 InputStream/OutputStream 的单字节方法。
  • 我添加了下载代码,以防有一些我不知道的相关内容 - 如 &那时正在转换。我使用 DOM 解析器完成了完全相同的过程,但性能无法接受。不过输出是正确的。
  • 仍然没有足够的上下文,但我还是试了一下。请参阅下面的答案。
  • 不知道还能给你什么 - 这是完整的解析器和处理程序减去异常和初始化变量。
  • 好吧,我们不知道 HandlerReps 是什么,getTheList() 等。但是无论如何,请参阅下面的答案,相应地修复您的代码,您会没事的。

标签: java android


【解决方案1】:

这很可能是您的问题的原因:

    if (currentElement) 
    {
        currentValue = new String(inChar, inStart, inLength);
        currentElement = false;
    }

对于每个文本内容节点,SAX 解析器可能会向您的处理程序发送多个 characters() 事件。如果你连接所有这些事件,你只会得到整个文本。但是在您的代码中,只使用了这些事件中的第一个,因为您设置了currentElement = false

问题不在于&符号转换。作为一般规则,当您描述问题时,通常最好只描述症状,而不是任何假定的原因。

【讨论】:

  • 好的 - 我明白了。这不是转换。我想'&'与裸 & 符号会影响 Sax 处理输出的方式。它没有。
  • 文本(很可能)被分解为多个事件因为&amp;amp;。 SAX 是一个非常注重性能的 API,这就是它将文本作为多个事件发送的原因。解析器读取字符数组,如果找到&amp;amp;,它会将直到&amp;amp; 的所有内容发送到处理程序,然后发送一个未转义的&amp;amp; 字符,然后在&amp;amp; 之后发送数组的其余部分。这样,解析器可以避免创建一个新的字符数组只是为了取消&amp;amp;。 (请注意,这是 SAX 解析器可能工作的一种方式,还有其他可能性。)
  • 我现在跟着你。我读过那个'&'与裸 & 符号相比,会影响 Sax 处理/构建字符数组的方式。显然这不是真的。无论如何,进行了您建议的更改,并且现在可以正常工作。感谢您的帮助!
  • 如果您的 XML 文件中有一个“裸 &”,SAX 解析器将简单地抛出一个异常。 XML 输入中的任何地方都不允许使用“A & B”之类的内容。
猜你喜欢
  • 1970-01-01
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 2014-06-16
相关资源
最近更新 更多