1

以下のデータをAndroidで解析したいと思います。

<?xml version="1.0" encoding="UTF-8"?>

 Info: POST /Remindz_api/user/loginHTTP/1.1 
 Host: www.narola.co 
 Accept: www.narola.co.beepz.api+xml 
 HTTP 1.1 200 OK 
 Content-Type: www.narola.co.beepz.api+xml; 
 Allow : GET,POST

  <user id="43">
    <firstname>Dfdf</firstname>
    <lasttname>p2</lasttname>
    <email>p</email>
    <telephone>2236</telephone>
    <created_on>2013-01-04 04:38:05</created_on>
    <atom:link <a href="http://www.narola.co/remindz/reminders/43"></a> />
  </user>

私は以下のコードを使用しましたが、データが純粋にxmlであるため、解析できません。

DocumentBuilder newDocumentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document parse = newDocumentBuilder.parse(new ByteArrayInputStream(result.getBytes()));
Log.d("result",parse.getChildNodes().toString());

よろしくお願いします。

4

2 に答える 2

0

XmlPullParserSAX parserまたはなどの xml 解析手法を使用しますDOM parser

androidの開発者サイトで推奨されているパーサーは XML Pull parser です Pull parserのチュートリアルは こちらです。

于 2013-01-31T09:17:14.420 に答える
0

まず、受け取ったテキストのチャンクから正しい XML を抽出する必要があります。

これは、次の 2 つの操作に依存します。

  • HTTP 関連のすべての行を取り除く
  • <atom:link\>XML 規則に従って無効な構文を次のように変更します。

このタスクは、事前に生のテキストを正規表現で処理することによって実行できます。あなたの場合、これらの式を使用できます。

public class XMLTest {

    static String data = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "\n" + " Info: POST /Remindz_api/user/loginHTTP/1.1\n"
            + " Host: www.narola.co \n" + " Accept: www.narola.co.beepz.api+xml\n" + " HTTP 1.1 200 OK \n"
            + " Content-Type: www.narola.co.beepz.api+xml;\n" + " Allow : GET,POST\n" + "\n" + "  <user id=\"43\">\n"
            + "    <firstname>Dfdf</firstname>\n" + "    <lasttname>p2</lasttname>\n" + "    <email>p</email>\n"
            + "    <telephone>2236</telephone>\n" + "    <created_on>2013-01-04 04:38:05</created_on>\n"
            + "    <atom:link <a href=\"http://www.narola.co/remindz/reminders/43\"></a> />\n" + "  </user>";

    public static void main(final String[] args) {
        /*
         * This strips off "Param:Value"-style lines 
         */
        String xmlData = data.replaceAll(" *[a-z\\-A-Z]* *:[^<]*\n", "");
        /*
         * This strips off "HTTP line" 
         */
        xmlData = xmlData.replaceAll(" *HTTP .*\n", "");

        /*
         * Correct atom:link format
         */
        xmlData = xmlData.replaceAll("<atom:link (.*) />", "<atom:link>$1</atom:link>"); 

        try {
            DocumentBuilder newDocumentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();

            Document doc = newDocumentBuilder.parse(new ByteArrayInputStream(xmlData.getBytes("UTF-8")));

            Element elem = doc.getDocumentElement();
            dump("", elem);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void dump(final String pad, final Node node)
    {
        System.out.println(pad + node.toString());

        if(node.getChildNodes() != null)
        {
            for(int i=0; i< node.getChildNodes().getLength();i++)
            {
                dump(pad + " ", node.getChildNodes().item(i));
            }
        }
    }

結果として得られるテキストは、DOM パーサーにフィードできない完全に有効な XML です。

<?xml version="1.0" encoding="UTF-8"?>

  <user id="43">
    <firstname>Dfdf</firstname>
    <lasttname>p2</lasttname>
    <email>p</email>
    <telephone>2236</telephone>
    <created_on>2013-01-04 04:38:05</created_on>
    <atom:link><a href="http://www.narola.co/remindz/reminders/43"></a></atom:link>
  </user>
于 2013-01-31T09:19:51.283 に答える