我在res下创建了一个xml文件夹,并将myxml.xml放在xml文件夹中。 RES / XML / myxml.xml
我想根据身份证号码阅读说明。我怎样才能做到这一点? 请帮忙。
myxml.xml就是这样;
<?xml version="1.0" encoding="utf-8" ?>
<Books>
<Number id ="1">
<Description>This is childrens book.
</Description>
</Number>
<Number id = "2">
<Description>This is about cooking.
</Description>
</Books>
以下是我正在使用的代码(但似乎没有做任何事情)
try{
XmlPullParser xpp = getResources().getXml(R.xml.myxml);
while(xpp.getEventType() != XmlPullParser.END_DOCUMENT){
if(xpp.getEventType() == XmlPullParser.START_TAG){
if(xpp.getName().equals("Description")){
show1.setText(" " + xpp.getAttributeValue(1));
}
}
xpp.next();
}
}
catch(Throwable t){
}
答案 0 :(得分:2)
对于您在此处尝试实现的目标,我建议您使用javax.xml.xpath。取自该页面上的示例,适用于您的XML文件(这里的XPath将获取ID属性为2的Number的描述):
XPath xpath = XPathFactory.newInstance().newXPath();
String expression = "//Number[@id='2']/Description";
try {
InputSource inputSource = new InputSource(activity.getResources().openRawResource(R.raw.myxml));
Node node = (Node) xpath.evaluate(expression, inputSource, XPathConstants.NODE);
String description = node.getTextContent();
} catch (Exception e) {
Log.d("ParseException", e.toString());
}
我稍微更新了示例以从资源输入流加载InputSource。为此,看起来您需要将xml文件放在res / raw文件夹而不是res / xml中(基于此答案:problem loading and parsing xml from resources)。我还必须做项目&gt;干净,让这个工作。
您可能还希望以更好的方式处理解析异常错误!
答案 1 :(得分:2)
当活动在其中为null时,它甚至会如何工作.. u doin null.getResources();
答案 2 :(得分:1)
你可以使用这个,我相信这有助于你
XmlResourceParser pars = res.getXml(R.xml.myxml);
while (pars.getEventType() != XmlResourceParser.END_DOCUMENT) {
if (pars.getEventType() == XmlResourceParser.START_TAG) {
if(pars.getName().equals("Number")) {
int id = pars.getAttributeIntValue(null, "id", 0);
}
}
pars.next();
}
pars.close();
在您的Xml中,您忘记将/
放入数字标记
<Number id ="1" />
使用此链接了解XmlResourceParser,它易于使用 http://www.anddev.org/using_xmlresourceparser_to_parse_custom_compiled_xml-t9313.html
答案 3 :(得分:1)
它无效的原因是因为当前xrp.getName()
为eventType
时您正在调用XmlPullParser.TEXT
方法。
public abstract String getName()
对于START_TAG或END_TAG事件......如果 当前事件不是START_TAG, END_TAG或ENTITY_REF,null为 返回。
我会创建一个Stack<String>
来保存我当前所在元素的名称。当我到达开始标记时,我会将名称推到顶部,当我点击结束标记时,我会将名称从顶部弹出。这样,当我在文本元素中时,我会知道当前位置的整个xPath。
答案 4 :(得分:0)
我注意到在您的示例中,XML似乎缺少关闭</Number>
标记,其中id属性等于“2”。可能出现格式错误,例如这可能导致您的错误。
答案 5 :(得分:0)
我不会使用XPath
,XMLResourceParser - 类就是为了做到这一点(tutorial)。
答案 6 :(得分:0)
问题在于您无法访问路径上的APK资源,因为它们已编译到您的应用程序中。如果要直接访问资源,请尝试以下操作:
InputStream inputStream = context.getResources().openRawResource(R.xml.myxml);
InputSource inputSource = new InputSource(inputStream);
您可能需要使用将XML文件移到res/raw/
文件夹中,然后使用R.raw.myxml
来访问它。
答案 7 :(得分:0)
您很可能遇到意外情况,并且您的程序会抛出异常而死亡。
找到打印的堆栈跟踪并将其添加到您的问题中。这很可能会告诉你原因。一个非常常见的原因是有未初始化的变量,然后你尝试在给出NullPointerException时调用一个方法。
答案 8 :(得分:0)
我不认为你的“if”条件是否满足。返回一个非空的字符串,看看是否显示。如果是,请重新查看getEventsFromAnXML方法的逻辑。