通过JAVA解析xml时遇到的问题

通过JAVA解析xml时遇到的问题,java,android,xml,parsing,Java,Android,Xml,Parsing,我试图通过JAVA解析xml,但解析后我得到了org.apache.harmony.xml.dom。DocumentImpl@418b4c98 这里是我试图解析的XML,例如,我需要id数据是5和default\u image是https://www.10ngah.com/api/images/products/5/5 Xml 解析代码 package com.prestoshop.xmlparser; import java.util.List; import org.w3c.dom.D

我试图通过JAVA解析xml,但解析后我得到了org.apache.harmony.xml.dom。DocumentImpl@418b4c98

这里是我试图解析的XML,例如,我需要
id
数据是
5
default\u image
https://www.10ngah.com/api/images/products/5/5

Xml


解析代码

package com.prestoshop.xmlparser;

import java.util.List;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import android.app.Activity;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.BaseAdapter;
import android.widget.Toast;
import com.prestoshop.beans.ProductItems;
import com.prestoshop.utils.Utils;

public class ProductLoaderTask extends AsyncTask<Void, ProductItems, Void> {

private Activity mContext;
private List<ProductItems> products;
private BaseAdapter adapter;

public ProductLoaderTask(Activity context, List<ProductItems> productList,
        BaseAdapter adapter) {
    mContext = context;
    products = productList;
    this.adapter = adapter;
}

static final String KEY_PRESTASHOP = "prestashop";
static final String KEY_ALL_PRODUCTS = "products";

@Override
protected Void doInBackground(Void... params) {

    String url = Utils.PRODUCTS_URL;// use varargs just like an array
    Log.e("urlll", "" + url);
    XMLParser parser = new XMLParser();
    String xml = parser.getXmlFromUrl(url);
    Log.e("string xml", "" + xml);
    Document doc = parser.getDomElement(xml, mContext);


    NodeList nl = doc.getElementsByTagName("product");
            Log.e("noddd",""+nl);
    for (int i = 0; i < nl.getLength(); i++) {
        Element e = (Element) nl.item(i);
        Log.e("eeee", "" + e.toString());
        Log.e("nodelist", ""
                + parser.getValue(e, "price").toString());

        publishProgress(new ProductItems(
                parser.getValue(e, "name"),
                parser.getValue(e, "id"), parser.getValue(e,
                        "id_default_image"), 12.050000));

    }

    return null;
}

@Override
protected void onProgressUpdate(ProductItems... values) {

    ProductItems product = values[0];
    products.add(product);
    adapter.notifyDataSetChanged();
}

@Override
protected void onPostExecute(Void result) {
    Log.e("All done", products.toString());
    super.onPostExecute(result);
 }
}
package com.prestoshop.xmlparser;
导入java.util.List;
导入org.w3c.dom.Document;
导入org.w3c.dom.Element;
导入org.w3c.dom.Node;
导入org.w3c.dom.NodeList;
导入android.app.Activity;
导入android.os.AsyncTask;
导入android.util.Log;
导入android.widget.BaseAdapter;
导入android.widget.Toast;
导入com.prestoshop.beans.ProductItems;
导入com.prestoshop.utils.utils;
公共类ProductLoaderTask扩展异步任务{
私人活动mContext;
私人上市产品;
专用基址适配器;
public ProductLoaderTask(活动上下文、列表productList、,
基本适配器(适配器){
mContext=上下文;
产品=产品列表;
this.adapter=适配器;
}
静态最终字符串键\u PRESTASHOP=“PRESTASHOP”;
静态最终字符串键\u ALL\u PRODUCTS=“PRODUCTS”;
@凌驾
受保护的Void doInBackground(Void…参数){
String url=Utils.PRODUCTS\u url;//像数组一样使用varargs
Log.e(“urll”,即“+url”);
XMLParser=新的XMLParser();
字符串xml=parser.getXmlFromUrl(url);
Log.e(“字符串xml”,即“+xml”);
Document doc=parser.getdoElement(xml,mContext);
NodeList nl=doc.getElementsByTagName(“产品”);
Log.e(“noddd”和“+nl”);
对于(int i=0;i
示例XML:

<a>
<b category='3' number='25' points='2'>
<c>
<d filename='' content='some content'/>
<d filename='0134.jpg'/>
</c>
<e>
<f description='desc' correct='1'/>
</e>
</a>
解析类中的方法:

    private void parseXml()
    {
        try
        {
            XmlPullParser parser = Xml.newPullParser();
            parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
            parser.setInput(questionsXmlFile, null);
            parser.nextTag();
            parser.require(XmlPullParser.START_TAG, null, TAG_A);
            while (parser.next() != XmlPullParser.END_DOCUMENT)
            {
                if (parser.getEventType() == XmlPullParser.START_TAG)
                {
                    String name = parser.getName();
                    if (name.equalsIgnoreCase(TAG_B))
                    {
                        parser.getAttributeValue(null, ATT_CATEGORY));
                        parser.getAttributeValue(null, ATT_POINTS));
                    }
                    else if (name.equalsIgnoreCase(TAG_D))
                    {
                        parser.getAttributeValue(null, ATT_CONTENT));
                        parser.getAttributeValue(null, ATT_FILE_NAME));
                    }
                    else if (name.equalsIgnoreCase(TAG_ANSWER))
                    {
                    }
                }
            }
        }
        catch (XmlPullParserException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
这个方法有什么作用? 它从头到尾遍历xml文档,检查是否找到了感兴趣的标记。如果是,请检查所需的属性,但不进行任何操作(添加您自己的操作。
请记住,
getAttributeValue()
可以返回null。请确保不要对
null
进行操作

请记住,
parser.require(XmlPullParser.START_TAG,null,TAG_A)
如果传递给它的变量在比较解析器的当前情况时出错,则返回异常。

首先,您的示例有语法错误(属性前缺少空格)

我非常喜欢JAXB…因此我建议您使用它。如果您的数据具有静态格式(而不是及时更改格式),这是最好的方法。唯一的“问题”可能是CDATA块,请参阅以获取更多信息。 这里有一个“快速”的例子…它不是很好的代码,只是一个例子



    public class AdapterCDATA extends XmlAdapter {


      @Override
      public String marshal(String arg0) throws Exception {
        return "";
      }

      @Override
      public String unmarshal(String arg0) throws Exception {
        return arg0;
      }
    }


在文档后面使用
XmlPullParser

已将xml复制到本地解析器的Assets文件夹(仅用于测试)。您可以从url获取xml并进行解析

 InputStream is = MainActivity.this.getResources()
                     .getAssets().open("xmlparser.xml");
               new parserPull(is);
然后进行解析

public class parserPull
{

    private static final String ns = null;
    public parserPull(InputStream open) {
        try
        {
             XmlPullParser parser = Xml.newPullParser();
             parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
             parser.setInput(open, null);
             parser.nextTag();
             List<Entry> all = readFeed(parser);
             for(int i=0;i<all.size();i++)
             {
             Log.i("ID is..........",all.get(i).id);
             Log.i("Link is........",all.get(i).link);
             Log.i("Price is.......",all.get(i).price);
             }
        }catch(Exception e)
        {
            e.printStackTrace();
        }
    }
    private List<Entry> readFeed(XmlPullParser parser) throws XmlPullParserException, IOException {
         List<Entry> entry = null;
        parser.require(XmlPullParser.START_TAG, ns, "prestashop");
        while (parser.next() != XmlPullParser.END_TAG) {
            if (parser.getEventType() != XmlPullParser.START_TAG) {
                continue;
            }
            String name = parser.getName();
            //Log.i("..................",name);
            // Starts by looking for the prestashop tag
            if (name.equals("products")) {
              entry= readProducts(parser);
            } else {
                skip(parser);
            }
        }  
        return entry;
    }
    private List<Entry> readProducts(XmlPullParser parser) throws XmlPullParserException, IOException {
        List<Entry> entries = new ArrayList<Entry>();

        parser.require(XmlPullParser.START_TAG, ns, "products");
        while (parser.next() != XmlPullParser.END_TAG) {
            if (parser.getEventType() != XmlPullParser.START_TAG) {
                continue;
            }
            String name = parser.getName();
           // Log.i("..................",name);
            // Starts by looking for the products tag
            if (name.equals("product")) {
                entries.add(readEntry(parser));
            } else {
                skip(parser);
            }
        }  
        return entries;
    }
    private Entry readEntry(XmlPullParser parser) throws XmlPullParserException, IOException {
        parser.require(XmlPullParser.START_TAG, ns, "product");
        String title = null;
        String summary = null;
        String link = null;
        while (parser.next() != XmlPullParser.END_TAG) {
            if (parser.getEventType() != XmlPullParser.START_TAG) {
                continue;
            }
            String name = parser.getName();
           // Log.i("...................",name);
            if (name.equals("id")) {
                title = readId(parser);
            } else if (name.equals("id_default_image")) {
                summary = readLink(parser);
            } else if (name.equals("price")) {
                link = readPrice(parser);
            } else {
                skip(parser);
            }
        }
        return new Entry(title, summary, link);
    }
    private String readPrice(XmlPullParser parser) throws IOException, XmlPullParserException {
        parser.require(XmlPullParser.START_TAG, ns, "price");
        String summary = readText(parser);
        parser.require(XmlPullParser.END_TAG, ns, "price");
        return summary;
    }
    private String readLink(XmlPullParser parser) throws IOException, XmlPullParserException {
        String link = "";
        parser.require(XmlPullParser.START_TAG, ns, "id_default_image");
        String tag = parser.getName();
       // Log.i("............",tag);
        String relType = parser.getAttributeValue(null, "not_filterable");  
        if (tag.equals("id_default_image")) {
            if (relType.equals("true")){
                link = parser.getAttributeValue(null, "xlink:href");
                parser.nextTag();
            } 
        }
        parser.require(XmlPullParser.END_TAG, ns, "id_default_image");
        return link;
    }
    private String readId(XmlPullParser parser) throws IOException, XmlPullParserException {
        parser.require(XmlPullParser.START_TAG, ns, "id");
        String title = readText(parser);
        parser.require(XmlPullParser.END_TAG, ns, "id");
        return title;
    }
    private String readText(XmlPullParser parser) throws IOException, XmlPullParserException {
        String result = "";
        if (parser.next() == XmlPullParser.TEXT) {
            result = parser.getText();
            parser.nextTag();
        }
        return result;
    }
    private void skip(XmlPullParser parser) throws XmlPullParserException, IOException {
        if (parser.getEventType() != XmlPullParser.START_TAG) {
            throw new IllegalStateException();
        }
        int depth = 1;
        while (depth != 0) {
            switch (parser.next()) {
            case XmlPullParser.END_TAG:
                depth--;
                break;
            case XmlPullParser.START_TAG:
                depth++;
                break;
            }
        }
     }
    public static class Entry {
        public final String id;
        public final String link;
        public final String price;

        private Entry(String id, String link, String price) {
            this.id = id;
            this.link = link;
            this.price = price;
        }
    }
} 

您的代码看起来一切正常,只是您必须删除

更改为526

或者,如果您不想删除它,请按照以下方式进行操作

添加以下方法/功能:

public String getCDataValue(Element e, String id) {
        NodeList title = e.getElementsByTagName(id);
        Element ex = (Element) title.item(0);
        Node child = ex.getFirstChild();
        if (child instanceof CharacterData) {
            CharacterData cd = (CharacterData) child;
            return cd.getData().trim();
        }
        return "";
}
NodeList nl = doc.getElementsByTagName("product");
       for (int i = 0; i < nl.getLength(); i++) {
        Element e = (Element) nl.item(i);
        Toast.makeText(getApplicationContext(), getCDataValue(e, "price"),
        Toast.LENGTH_SHORT).show();
}
publishProgress(new ProductItems(
                      getCDataValue(e, "name"),
                      getCDataValue(e, "id"),
                      getCDataValue(e, "id_default_image"),
                      12.050000)
);
然后这样使用:

public String getCDataValue(Element e, String id) {
        NodeList title = e.getElementsByTagName(id);
        Element ex = (Element) title.item(0);
        Node child = ex.getFirstChild();
        if (child instanceof CharacterData) {
            CharacterData cd = (CharacterData) child;
            return cd.getData().trim();
        }
        return "";
}
NodeList nl = doc.getElementsByTagName("product");
       for (int i = 0; i < nl.getLength(); i++) {
        Element e = (Element) nl.item(i);
        Toast.makeText(getApplicationContext(), getCDataValue(e, "price"),
        Toast.LENGTH_SHORT).show();
}
publishProgress(new ProductItems(
                      getCDataValue(e, "name"),
                      getCDataValue(e, "id"),
                      getCDataValue(e, "id_default_image"),
                      12.050000)
);

听起来你在调用
toString()
,看起来它没有被覆盖。不幸的是,我们看不到您的代码,也不知道您想要实现什么,这使得很难帮助您。您使用的是哪种解析器?
XmlPullParser
?我在上面添加了java代码,我使用的是dom解析器。请帮助me@ashutiwari4看看下面的文档选择一个引用“推荐XmlPullParser,这是在Android上解析XML的一种高效且可维护的方法”的解析器。另外,还有一个示例,在docs@Raghunandan我已经通过了,在解析之后,它没有在日志中打印任何内容
publishProgress(new ProductItems(
                      getCDataValue(e, "name"),
                      getCDataValue(e, "id"),
                      getCDataValue(e, "id_default_image"),
                      12.050000)
);