【问题标题】:XML Parser AndroidXML 解析器 Android
【发布时间】:2012-01-12 02:19:52
【问题描述】:

我有一个巨大的 HTML 文件,如下所示:

<html>
 <head>

 </head>
 <body>
    <div id="wraper">
      <div id="..."> </div>
      <div id="..."> </div>
      <div id="..."> </div>
      <div class="col x8 black">
         <div class="sidebar"> 
          <script .../>
          <script .../>
          <div class="side-box last10">
           <h3 .../>
           <ul class="sidebarlist">
             <li class="fisrt"> Need this Text </li>
             <li> Need this Text too (1) </li>
             <li> Need this Text too (2) </li>
           </ul>
         </div>
      </div
    </div>
 </body>

如何在这个 html 文件中“导航”以获取我想要的文本?

html->body->div#wraper->div#col x8 black-> div#side-vox last10-> ul#sidebarlist -> li#first

对于这项工作,DOM 和 SAX 哪个更好? (我不是以英语为母语的人)

【问题讨论】:

标签: java android dom xml-parsing sax


【解决方案1】:

您考虑过 XPath 吗?你的伪代码:

html->body->div#wraper->div#col x8 black-> div#side-vox last10-> 
    ul#sidebarlist -> li#first

...直接转换为以下 XPath 表达式:

/html/body/div[@id='wraper']/div[@class='col x8 black']/
    div[@class='side-vox last10']/ul[@class='sidebarlist']/li[@class='fisrt']

或者,更简洁(假设您的示例中的结构具有代表性):

/html/body/div[1]/div[4]/div[1]/div[1]/ul[1]/li[1]

有关在 Android 上使用 XPath 的信息可以在这里找到:

【讨论】:

  • 谢谢@lwburk。在 Android 1.6 上(我的错是我没有 t metioned if) I dont 有 XPath,但我读到了一个可以做这些事情的库。
【解决方案2】:

您可以XmlPullParser 这样做。请通过以下代码:

  public void parsing(String str1) throws XmlPullParserException, IOException{
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        factory.setNamespaceAware(true);
        XmlPullParser xpp = factory.newPullParser();
        xpp.setInput( new StringReader (str1));
        int eventType = xpp.getEventType();
        while (eventType != XmlPullParser.END_DOCUMENT) {
            String str;
         if(eventType == XmlPullParser.START_DOCUMENT) {
            System.out.println("Start document");
         } else if(eventType == XmlPullParser.START_TAG) {
             str    =    xpp.getName();
             System.out.println("Start tag "+str);
             if(xpp.getName().equals("div")){
                 int attrCount    =    xpp.getAttributeCount();
                 if(attrCount != -1) {
                     for(int x=0;x<attrCount;x++) {
                         System.out.println("Attr Name= "+ xpp.getAttributeName(x));
                         System.out.println("Attr Value= "+ xpp.getAttributeValue(x));
                     }
                 }
            }
         } else if(eventType == XmlPullParser.END_TAG) {
             System.out.println("End tag "+xpp.getName());
         } else if(eventType == XmlPullParser.TEXT) {
             System.out.println("Value= "+xpp.getText());
         }
         eventType = xpp.next();
        }
       System.out.println("End document");
    }

【讨论】:

  • 在 xpp.next() 函数停止运行(XMLPullParserExeption),但如果我将它添加到 try-catch 和 catch 函数中,我会重复该函数,一切都很完美。
  • 这种方法速度慢。没有像`xpp.getChild("html").getChild("body").getValue(); 这样的方法?
  • 我不想处理 xml 文件的所有元素。我只想在那个 xml 文件中搜索一些“变量”。
  • 嗨,如果您只想获取某些变量的值,那么您可以在这些值中编写一个 if 条件,例如: if(eventType == XmlPullParser.TEXT) { if("current_start_tag".equals( "必填标签")){ System.out.println("Value= "+xpp.getText());}}
  • 正是我想要的,但我怎样才能得到“current_statrt_tag”?在
    我怎样才能获得“class”属性值(即“one”)?
猜你喜欢
  • 2012-05-21
  • 2011-04-30
  • 1970-01-01
  • 2012-10-01
  • 2012-05-02
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多