3

我在 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>

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

请帮我解决这个问题。任何帮助都是不言而喻的。

提前致谢。

4

2 回答 2

2

这应该适用于您的 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();
    }
  }
}

这应该在调试输出上打印与您传递给函数的部分参数相对应的两个链接。

当然,您可以按照您想要的方式对其进行调整。

于 2013-12-27T14:18:36.420 回答
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,输出将是 section1 中的链接 1 是 ImageLink 1 .. section2 中的链接 4 是 ImageLink 2

于 2013-08-22T22:48:59.393 回答