Android XML 解析省略“&”

Posted

技术标签:

【中文标题】Android XML 解析省略“&”【英文标题】:Android XML Parsing omitting "&" 【发布时间】:2010-12-30 17:12:51 【问题描述】:

问题又是,虽然我已经成功地在我的代码中实现了一个 SAX 解析器......它的行为很奇怪。它只是跳过 & 之后的条目并转到下一个条目。只是想知道这是 SAX 解析器的典型工作方式还是我错误地实现了它???

我已经实现了 org.xml.sax.ContentHandler 并在里面提供了以下编码......

`

public void characters(char[] ch, int start, int length)
         
             if(lastName.equals("id"))
             
                 String id = String.copyValueOf(ch, start, length);
                 CustomList.idvector.add(id);
             
             else if(lastName.equals("subcategory"))
             
                String subcategory = String.copyValueOf(ch, start, length);
                 CustomList.subcategoryvector.add(subcategory);
             
             else if(lastName.equals("photo"))
             
                 String photo = String.copyValueOf(ch, start, length);
                 CustomList.photovector.add(photo);
             
             else if(lastName.equals("name"))
             
                 String name = String.copyValueOf(ch, start, length);
                 CustomList.namevector.add(name);
             
         

`

有些元素带有标签 ,,,... 和 m 将这些信息放入向量中...这是正确的吗???

现在又一个问题是我无法解析像“$”这样的特殊字符……有什么办法可以捕捉到这些字符??

【问题讨论】:

【参考方案1】:

不太确定您所看到的确切内容,如果这不能帮助您解决问题,也许您可​​以提供一些示例输入和输出。

& 是一个 XML 实体引用,表示 &

默认情况下,SAX 会为您进行转换,因此如果您的源 XML 显示 hello&goodbye,您应该会看到 hello&goodbye

也可能是因为实体引用,SAX 正在中断对characters() 方法的调用。您可能需要将多个对characters() 的调用连接在一起,同时仍在同一个标​​签内。

【讨论】:

但还有 1 个疑问......我问这个问题很愚蠢,但空间会产生任何问题吗?? 顺便说一下,Brabster 能否提供一些相同的编码...这种情况……如何判断下一个字符是否为&amp??? 抱歉,我的电脑不在。很高兴您解决了您的问题。 android characters() 上确实在同一标签内被多次调用,因此对于输入“bob & jay”,将有三个单独的调用。【参考方案2】:

这对 4 个我有用……谢谢布拉布斯特……

public void characters(char[] ch, int start, int length)
             
                 if(lastName.equals("id") && (lastName != lastElementTraversed))
                 
                     String s = new String(ch, start, length);
                     if (appendedid == null) 
                     
                         appendedid = new StringBuffer(s);
                      else 
                          appendedid.append(s);
                     

                 
            else if(lastName.equals("subcategory")&& (lastName !=lastElementTraversed))
                 
                     String s = new String(ch, start, length);
                     if (appendedsub == null) 
                         appendedsub = new StringBuffer(s);
                       else 
                          appendedsub.append(s);
                      
                     //lastElementTraversed = lastName;
                 
            else if(lastName.equals("photo")&& (lastName != lastElementTraversed))
                 
                     String s = new String(ch, start, length);
                      if (appendedphoto == null) 
                          appendedphoto = new StringBuffer(s);
                       else 
                          appendedphoto.append(s);
                      
                      //lastElementTraversed = lastName;
                 
            else if(lastName.equals("name") && (lastName != lastElementTraversed))
                 
                     String s = new String(ch, start, length);
                      if (appendedname == null) 
                          appendedname = new StringBuffer(s);
                       else 
                          appendedname.append(s);
                       
                      //lastElementTraversed = lastName;
                 
             
    public void startElement(String uri, String localName, String qName, Attributes atts)
            
                lastName = localName;
                appendedid=null;
                appendedsub=null;
                appendedphoto=null;
                appendedname=null;

            

             public void endElement(String uri, String localName, String qName)
             
                 lastElementTraversed = localName;
                 if(localName.equals("category"))
                    
                        appendedid=null;
                        appendedsub=null;
                        appendedphoto=null;
                        appendedname=null;

                    

                     if(appendedid!=null)
                     CustomList.idvector.add(appendedid.toString());
                     if(appendedsub!=null)
                     CustomList.subcategoryvector.add(appendedsub.toString());
                     if(appendedphoto!=null)
                     CustomList.photovector.add(appendedphoto.toString());
                     if(appendedname!=null)
                     CustomList.namevector.add(appendedname.toString());

             
        

【讨论】:

其实我检查了很多东西,因为我的客户拥有的 XML 文件真的很乱...忘记你不理解的东西...我想你会理解其中的大部分... :) 嗨,伙计们,问题又是我无法捕捉到像“$”和项目符号这样的特殊字符...在 SAX 解析中是否有出路,或者我们是否需要转向其他解析方法... JSON 能解决这个问题吗???

以上是关于Android XML 解析省略“&”的主要内容,如果未能解决你的问题,请参考以下文章

在 android studio 中使用 Jsoup 解析 xml 数据

android - string.xml 解析错误

Android实时显示时间日期(极简)

[翻译][Ruby教程]Nokogiri - 解析HTML/XML文档 / Parsing an HTML/XML Document

android中XML SAX解析器、Pull解析器和DOM解析器的区别

Android LayoutInflater&LayoutInflaterCompat源码解析