2

我是使用 SAX 解析的新手。我设法使用此代码获取返回的 xml 并将其绑定到我的 getter setter 上。

我的代码:

try {

        /**
         * Create a new instance of the SAX parser
         **/
        SAXParserFactory saxPF = SAXParserFactory.newInstance();
        SAXParser saxP = saxPF.newSAXParser();
        XMLReader xmlR = saxP.getXMLReader();


        URL url = new URL(""); // URL of the XML

        /** 
         * Create the Handler to handle each of the XML tags. 
         **/
        XMLHandler myXMLHandler = new XMLHandler();
        xmlR.setContentHandler(myXMLHandler);
        xmlR.parse(new InputSource(url.openStream()));

    } catch (Exception e) {
        System.out.println(e);
    }

    data = XMLHandler.data;

现在我的问题是,如何在我的 php url 上传递参数。因为在我的 PHP 文件中,我需要一些数据,以便我可以验证它是否有效。

假设我需要登录电话的人的用户名?

在 DOM 方法上,我可以做这样的事情

XMLParser parser2 = new XMLParser(); 
    parser2.getXmlFromUrl(URL_FBFRIEND); 

      //HTTP POST
      String url_Getmembermob= URL_FBFRIEND ;
      //String xml_getMembermob=null;
      try {
      HttpClient httpclient = new DefaultHttpClient();
      HttpPost httppost = new HttpPost(url_Getmembermob);

      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(4); 
      nameValuePairs.add(new BasicNameValuePair("blah", "blah"));
      nameValuePairs.add(new BasicNameValuePair("blah", "blah"));
      nameValuePairs.add(new BasicNameValuePair("blah", "blah"));
      nameValuePairs.add(new BasicNameValuePair("blah", "blah"));

      //Log.i("nameValuePairs", "nameValuePairs=" + nameValuePairs);

        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        HttpResponse httpResponse = httpclient.execute(httppost);

        HttpEntity httpEntity = httpResponse.getEntity();

        FBFRIENDS = EntityUtils.toString(httpEntity);
4

2 回答 2

1

不要使用 URL 对象,而是继续使用 HttpClient。使用 HttpResponse.getInputStream() 方法。

XMLHandler myXMLHandler = new XMLHandler();
xmlR.setContentHandler(myXMLHandler);
xmlR.parse(httpResponse.getInputStream());
于 2012-10-19T13:55:38.550 回答
1

SAX 是一个推送解析器。这意味着它通过一个 XML 文档,基于它生成事件并将它们向前推送以供您处理。它不会像 DOM 那样创建对象树。但它可以帮助您创建自定义对象或您选择的对象层次结构,而内存占用要少得多。

生成的 SAX 事件可能类似于“呃!哦!我刚刚点击了一个元素打开标签”、“好吧!我点击了一个属性”或“字符!亲爱的上帝,我找到了一个文本值”。通常为在被解析的 XML 文档中找到的每个 XML 构造生成一个事件,但并非所有这些都需要处理。处理的内容由处理程序的实现指定(setContentHandler(myXMLHandler)在您的示例中使用设置)。

为了获得特定的 XML 内容,您需要实现或使用特定处理程序的实现。您的示例使用了一个名为XMLHandler. 我不知道您是自己实现了它还是它只是一些默认实现。从外观上看,它只是将 XML 文档的全部内容复制到 String 成员中,这并不是您真正想要用 SAX 做的事情(DOM 会为您做得更好)。

你现在需要做的是通过实现一个处理程序来创建一个包含你需要的数据的对象。这是一个示例(您应该以您认为合适的方式构建对象,而不仅仅是打印内容):

public class DummyHandler extends DefaultHandler{
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        super.characters(ch, start, length);
        System.out.println("characters! dear god, I've located a text value");
    }

    @Override
    public void endElement(String uri, String localName, String name)
            throws SAXException {
        super.endElement(uri, localName, name);
        System.out.println("an element was ended. may it R.I.P. o7");
    }

    @Override
    public void startElement(String uri, String localName, String name,
            Attributes attributes) throws SAXException {
        super.startElement(uri, localName, name, attributes);
        System.out.println("uh! oh! I've just hit an element openening tag");
    }
}

有关更多详细信息,请参见此处

于 2012-10-19T13:57:30.657 回答