如何在android中使用DOM解析xml字符串
我有一个Android应用程序,可以从Web服务调用中获得xml响应。我正在尝试使用DOM解析器解析xml。我在获取StartDate标记以及call标记中其他标记的值时遇到问题。知道我哪里出错了吗。当我从startDate中注销该值时,它是空的。谢谢如何在android中使用DOM解析xml字符串,android,xml,dom,Android,Xml,Dom,我有一个Android应用程序,可以从Web服务调用中获得xml响应。我正在尝试使用DOM解析器解析xml。我在获取StartDate标记以及call标记中其他标记的值时遇到问题。知道我哪里出错了吗。当我从startDate中注销该值时,它是空的。谢谢 public class DomParser { private static final String TAG = DomParser.class.getSimpleName(); DocumentBuilderFactory
public class DomParser {
private static final String TAG = DomParser.class.getSimpleName();
DocumentBuilderFactory builderFactory;
DocumentBuilder builder;
Document document;
public DomParser() {
super();
Log.e(TAG, "inside domparser constructor");
builderFactory = DocumentBuilderFactory.newInstance();
document = null;
try {
builder = builderFactory.newDocumentBuilder();
Log.e(TAG, "built the dom factory");
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
}// end of constructor
public void parseXmlString(String str){
try {
String s = str.replace("<", "<");
String t = s.replace(">", ">");
document = builder.parse( new InputSource(new StringReader(t)));
Log.e(TAG, "document = " + document);
Log.e(TAG, "str = " + t);
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Log.e(TAG, "about to parse the rootElement");
Element rootElement = document.getDocumentElement();
NodeList nodes = rootElement.getChildNodes();
Node rota = nodes.item(0);
NodeList callList = rota.getChildNodes();
for(int i = 0; i < callList.getLength(); i++){
Node call = callList.item(i);
NodeList callChildrenList = call.getChildNodes();
for(int j = 0; j < callChildrenList.getLength(); j++){
Node callChild = callChildrenList.item(j);
if(callChild instanceof Element){
//a child element to process
Element child = (Element) callChild;
String startDate = child.getAttribute("StartDate");
Log.e(TAG, "element StartDate = " + startDate);
}
}
}
}//end of parseXmlString
}
公共类DomParser{
私有静态最终字符串标记=DomParser.class.getSimpleName();
文档构建器工厂构建器工厂;
文档生成器;
文件;
公共DomParser(){
超级();
Log.e(标记,“内部domparser构造函数”);
builderFactory=DocumentBuilderFactory.newInstance();
document=null;
试一试{
builder=builderFactory.newDocumentBuilder();
Log.e(标记“构建dom工厂”);
}捕获(ParserConfiguration异常e){
e、 printStackTrace();
}
}//构造函数结束
公共void parseXmlString(String str){
试一试{
字符串s=str.replace(“,”);
document=builder.parse(新的InputSource(新的StringReader(t));
Log.e(标签,“document=”+document);
Log.e(标签,“str=”+t);
}捕获(SAXE异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
Log.e(标记“即将解析根元素”);
Element rootElement=document.getDocumentElement();
NodeList nodes=rootElement.getChildNodes();
节点rota=节点。项(0);
NodeList callList=rota.getChildNodes();
对于(int i=0;i
10-05 15:49:17.680:E/DomParser(31495):2012-10-05T07:00:00+01:002012-10-05T07:25:00+01:00251完成的退潮帮助穿衣、洗衣、留下饮料、留下三明治等,制作热饮、准备早餐、淋浴、,时间段-早早餐47418572-73a1-4dab-bc24-739C122B2B2B2507:3007:492012-10-05T07:30:00+01:002012-10-05T08:00+01:00301完整的BrownMorgareCareline,糖尿病2型,空马桶,钥匙保险箱,留下饮料,做热饮,二级管理,准备零食,时间段-早睡14F4F796-c7a6-4942-9d91-e9e7a40394f508:0008:212012-10-05T08:00+01:002012-10-05T08:40:00+01:00401完整的房车钥匙保险箱,晨叫-起床和早餐,个人护理2A7E6C70-ee2c-4657-a313-a18b87a766ed08:3509:132T0012-10-059:00+01:002012-10-05T09:20:00+01:00,钥匙保险箱,必要时铺床/更换,药物-二级管理,个人护理,准备早餐,时间带-晚早餐383C9BE6-4cbe-459a-92ed-5dc309a0bffb2012-10-05T09:00+01:002012-10-05T09:30:00+01:00301需要的完整卡斯蒂克利迪亚克,留下饮料,留下三明治,做热饮,必要时铺床/更换,药物提示,药物-二级管理,个人护理,时间段-早餐F4C1F96-ef65-4231-9e03-0b8263b04d2709:2809:572012-10-05T10:30:00+01:002012-10-05T11:00:00+01:00301完成的特蕾特玛协助敷料,药物-自我用药,晨叫,个人护理,脱衣,时间段-晚早餐03F52182-b9ff-4fa9-9b71-1a20b8bbeeaa10:1010:572012-10-05T12:00:00+01:002012-10-05T12:15:00+01:00151完整的Garland消毒导管袋,药物提示,药物-二级管理,时间段-早午餐,如厕/便桶802D8ADF-3a80-40bd-be91-f29db7c1291e11:1611:382012-10-05T12:30:00+01:00基于您的新示例代码类似的内容
// HERE LOOP TO FIND THE NODE LIKE YOU HAVE DONE IN YOUR EXAMPLE
// WHERE YOU HAVE callChild.getNodeName() AND LOOK FOR THE ONE THAT IS "StartDate"
// ASSUMING startDateNode HERE IS THE NODE YOU WANT
// GET THE CHILD NODES AND LOOK FOR THE TEXT NODE
NodeList nList = startDateNode.getChildNodes();
for (int i=0; i < nList.getLength(); i++) {
Node tmpNode = nList.item(i);
if (tmpNode.getNodeType() == Node.TEXT_NODE) {
String dateStr = ((CharacterData)tmpNode).getData();
// NOW YOU HAVE THE CHARACTER DATA
// DO SOMETHING WITH THE VALUE
}
}
//此处循环查找节点,就像您在示例中所做的那样
//其中有callChild.getNodeName()并查找“StartDate”
//假设startDateNode就是您想要的节点
//获取子节点并查找文本节点
NodeList nList=startDateNode.getChildNodes();
对于(int i=0;i
基于新示例代码的类似内容
// HERE LOOP TO FIND THE NODE LIKE YOU HAVE DONE IN YOUR EXAMPLE
// WHERE YOU HAVE callChild.getNodeName() AND LOOK FOR THE ONE THAT IS "StartDate"
// ASSUMING startDateNode HERE IS THE NODE YOU WANT
// GET THE CHILD NODES AND LOOK FOR THE TEXT NODE
NodeList nList = startDateNode.getChildNodes();
for (int i=0; i < nList.getLength(); i++) {
Node tmpNode = nList.item(i);
if (tmpNode.getNodeType() == Node.TEXT_NODE) {
String dateStr = ((CharacterData)tmpNode).getData();
// NOW YOU HAVE THE CHARACTER DATA
// DO SOMETHING WITH THE VALUE
}
}
//此处循环查找节点,就像您在示例中所做的那样
//其中有callChild.getNodeName()并查找“StartDate”
//假设startDateNode就是您想要的节点
//获取子节点并查找文本节点
NodeList nList=startDateNode.getChildNodes();
对于(int i=0;i
要获得正确的想法,我已经在这样的代码中实现了。要获得正确的想法,我已经在这样的代码中实现了。嗨,有一个rota标记。在rota标签内有多个呼叫标签。在每个调用标记中都有各种标记,我需要这些标记来获取值。一旦我进入调用标记中,随后的每个值都必须填充到一个数组中。最终会有一个数组,它是数组的数组。例如在t
// HERE LOOP TO FIND THE NODE LIKE YOU HAVE DONE IN YOUR EXAMPLE
// WHERE YOU HAVE callChild.getNodeName() AND LOOK FOR THE ONE THAT IS "StartDate"
// ASSUMING startDateNode HERE IS THE NODE YOU WANT
// GET THE CHILD NODES AND LOOK FOR THE TEXT NODE
NodeList nList = startDateNode.getChildNodes();
for (int i=0; i < nList.getLength(); i++) {
Node tmpNode = nList.item(i);
if (tmpNode.getNodeType() == Node.TEXT_NODE) {
String dateStr = ((CharacterData)tmpNode).getData();
// NOW YOU HAVE THE CHARACTER DATA
// DO SOMETHING WITH THE VALUE
}
}