2011-03-01 83 views
1

所以我试过搜索和搜索如何做到这一点,但我不断看到我需要的很多复杂的答案。我基本上使用Flurry Analytics API从HTTP请求返回一些xml代码,这就是它返回的结果。解析http返回的XML与java

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<eventMetrics type="Event" startDate="2011-2-28" eventName="Tip Calculated" endDate="2011-3-1" version="1.0" generatedDate="3/1/11 11:32 AM"> 
<day uniqueUsers="1" totalSessions="24" totalCount="3" date="2011-02-28"/> 
<day uniqueUsers="0" totalSessions="0" totalCount="0" date="2011-03-01"/> 
<parameters/> 
</eventMetrics> 

我想要得到的就是totalCount数字是3与Java的int或字符串。我查看了不同的DOM和SAX方法,他们似乎在标签之外获取信息。有什么方法可以在标签内抓取totalCount?

感谢,

更新

我发现这个网址 - http://www.androidpeople.com/android-xml-parsing-tutorial-%E2%80%93-using-domparser/

,帮助我考虑到这是在android系统。但是,我感谢所有回应帮助我的人。我检查了每一个答案,并且帮助了解了发生了什么。但是,现在我似乎无法从我的url中获取xml,因为它需要先发送一个HTTP帖子才能获取xml。当它从我的网址抓取XML时,它只是说没有找到文件。

更新2

我把一切都整理出来,现在读它,并从Flurry的分析得到的XML(仅供参考,如果有人绊倒在这个问题)

HTTP request for XML file

+0

哟意味着什么?“他们似乎抢在标签之外的信息?” – ajuc 2011-03-01 20:27:46

+0

我只是想说,从我的在线研究中我注意到许多抓取xml的方法是“寻找”外部标签并返回/寻找标签之间的信息。但在我的情况下,我没有标签之间的任何内容,它们是INSIDE标签。 – rwarner 2011-03-01 20:34:19

+0

为什么不只是使用xpath:/ eventMetrics/day/@ totalCount – 2011-03-01 21:29:45

回答

4

totalCount被我们称之为属性。如果您使用的是org.w3c.dom API,请在相应的元素上调用getAttribute("totalCount")

+0

org.w3c.dom是否有更多信息?我有我的文档doc = db.parse(in);在哪里是我的XML网址。但是我无法从创建的变量中分支出来。 – rwarner 2011-03-01 20:48:32

+1

伙计,来吧。我只是给了你一个链接到文档。 – 2011-03-01 21:06:32

+0

对不起,我完全在超链接上。我的错。 – rwarner 2011-03-01 22:25:32

2

一个JDOM的例子。请注意使用SAXBuilder加载文档。

URL httpSource = new URL("some url string"); 
Document document = SAXBuilder.build(httpSource); 
List<?> elements = document.getDescendants(new KeyFilter()); 

for (Element e : elements) { 
    //do something more useful with it than this 
    String total = (Element) e.getAttributeValue("totalCount"); 
} 

class KeyFilter implements Filter { 
    public boolean matches (Object obj) { 
    return (Element) obj.getName().equals("key"); 
    } 
} 
4

如果您使用的是SAX处理程序,覆盖startElement回调的方法来访问属性:

public void startElement (String uri, String name, String qName, Attributes atts) 
{ 
    if("day".equals (qName)) { 
     String total = attrs.getValue("totalCount"); 
    } 
} 
+1

@kentoe - 查看我对前一个问题的回答之一,了解如何创建XMLReader:http://stackoverflow.com/questions/3405702/using-sax-to-parse-common-xml-elements/3409270# 3409270 – 2011-03-01 21:05:27

0

我认为,最简单的方法是使用XPath,下面是基于vtd-为例XML。

import com.ximpleware.*; 
    public class test { 
     public static void main(String[] args) throws Exception { 
      String xpathExpr = "/eventMetrics/day/@totalCount"; 
      VTDGen vg = new VTDGen(); 
      int i = -1; 

      if (vg.parseHttpUrl("http://localhost/test.xml", true)) { 
       VTDNav vn = vg.getNav(); 
       AutoPilot ap = new AutoPilot(); 
       ap.selectXPath(xpathExpr); 
       ap.bind(vn); 
       System.out.println("total count "+(int)ap.evalXPathtoDouble()); 
        } 
     } 
    }