如何在android中使用XMLPullParsing在xml中获取子标签或子标签

时间:2013-07-23 10:34:46

标签: android xml xmlpullparser

我在android中使用XmlPullParser来解析XML文件。当我的xml中没有子标签时它运行正常,我只是使用XmlPullParse.START_TAG检查起始标签并获取相应的属性值,但是我遇到了问题,这里一个标签有另一个子标签,在此子标记中,有一个包含图像链接的属性。我无法从该子标记中提取该链接。

这是我的XML: -

<section name="section1">
    <photo id="1" ilink="ImageLink 1"/>
    <photo id="2" ilink="ImageLink 2"/>    
</section>

<section name="section2">
    <photo id="3" ilink="ImageLink 1"/>
    <photo id="4" ilink="ImageLink 2"/>    
</section>

我得到的是“section”的父标签,其属性是“name”但是如何根据section name获取“photo”标签?那就是如果我想解析名为“section2”的部分的照片标签,那么我该怎么做呢????

请帮我解决一下。任何帮助都会很明显。

提前致谢。

2 个答案:

答案 0 :(得分:2)

你可以写一个xsl

    

<xsl:template match="/">
  <xsl:for-each select="section">
    <xsl:value-of select="concat('link ',photo@id, ' from ',@name,' is ',photo@ilink)"><xsl:value-of> 
  </xsl:for-each>
</xsl:template>

在xml上运行xsl,输出结果为 第1节中的链接1是ImageLink 1 .. 第2节中的链接4是ImageLink 2

答案 1 :(得分:1)

这应该适用于您的Android应用程序。

<强> MainActivity.java

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Sample
        SampleXMLPullParser.GetLinks("section2");
    }
}

<强> SampleXMLPullParser.java

package com.example;

import java.io.StringReader;   
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

public class SampleXMLPullParser {

  public static void GetLinks (String section_name) {
    try {
      // Get the parser
      XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
      XmlPullParser xpp = factory.newPullParser();

      // XML data
      final String TAG_SECTION = "section";
      final String TAG_SECTION_ATTR_NAME = "name";
      final String TAG_PHOTO = "photo";
      final String TAG_PHOTO_ATTR_LINK = "ilink";
      final String inputXML = "<section name=\"section1\">"
                            +       "<photo id=\"1\" ilink=\"ImageLink 1\"/>"
                            +   "<photo id=\"2\" ilink=\"ImageLink 2\"/>"    
                            + "</section>"
                            + "<section name=\"section2\">"
                            +   "<photo id=\"3\" ilink=\"ImageLink 3\"/>"
                            +   "<photo id=\"4\" ilink=\"ImageLink 4\"/>"    
                            + "</section>";

      // Set the input
      xpp.setInput(new StringReader(inputXML));
      int eventType = xpp.getEventType();

      // Parser loop until end of the document
      boolean correctSection = false;
      while (eventType != XmlPullParser.END_DOCUMENT) {
        // Read the tag name
        String tagname = xpp.getName();

        // Check the event type
        if (eventType == XmlPullParser.START_TAG) {
          // Check 'section' tags
          if (tagname.equalsIgnoreCase(TAG_SECTION)) {
            // Opening tag, check the attribute
            String attrvalue = xpp.getAttributeValue(null, TAG_SECTION_ATTR_NAME);
            if (attrvalue.equals(section_name)) {
              // Section we're interested to
              correctSection = true;
            }
          }

          // Check 'photo' tags (only for the provided section)
          if (correctSection && tagname.equalsIgnoreCase(TAG_PHOTO)) {
            // Read the attribute and print on console
            String attrvalue = xpp.getAttributeValue(null, TAG_PHOTO_ATTR_LINK);
            System.out.println(attrvalue);
          }

        } else if (eventType == XmlPullParser.END_TAG) {
                       // Closing 'section' tag
                       if (correctSection && tagname.equalsIgnoreCase(TAG_SECTION))
                         correctSection = false;
        }

        // Move to next event
        eventType = xpp.next();
      }

    } catch (Exception e) {
        e.printStackTrace();
    }
  }
}

这应该在Debug输出上打印两个与你传递给函数的section参数对应的链接。

当然,您可以按照自己的方式进行调整。