首页 \ 问答 \ 如何解析(然后找到特定的)从API请求收到的XML数据?(How do I parse(and then find particular) XML data received from an API request?)

如何解析(然后找到特定的)从API请求收到的XML数据?(How do I parse(and then find particular) XML data received from an API request?)

我几乎是一个关于XML的完整初学者,并且只有非常基本的Java知识。 我过去一天尝试查找很多东西并尝试了许多代码片段,但还没有找到解决方案,所以我不知道我的搜索条件是错误的,还是我太困惑了。

我有这个URL( http://www.example.com/api/WebAPI/?dataset=wanted_dataset&keyref=12345 )从中获取XML数据并返回:

<channel>
  <title>PSI Update</title>
  <source>Airviro</source>
 <item>
   <region>...</region>
   <region>...</region>
   <region>...</region>
   <region>
     <id>rEA</id>
     <latitude>1.35735</latitude>
     <longitude>103.94000</longitude>
     <record timestamp="20160210160000">
       <reading type="NPSI" value="57"/>
       <reading type="NPSI_PM25_3HR" value="56"/>
       <reading type="NO2_1HR_MAX" value="5"/>
       <reading type="PM10_24HR" value="32"/>
       <reading type="PM25_24HR" value="18"/>
       <reading type="SO2_24HR" value="4"/>
       <reading type="CO_8HR_MAX" value="0.53"/>
       <reading type="O3_8HR_MAX" value="31"/>
       <reading type="NPSI_CO" value="5"/>
       <reading type="NPSI_O3" value="13"/>
       <reading type="NPSI_PM10" value="32"/>
       <reading type="NPSI_PM25" value="57"/>
       <reading type="NPSI_SO2" value="2"/>
   </record>
 </region>
<region>...</region>
<region>...</region>

到目前为止这是我的代码:

public class HazeCheck {

    public void getHazeLevel() throws Exception{            
        URL myUrl = new URL("http://www.example.com/api/WebAPI/?dataset=wanted_dataset&keyref=12345");
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document doc = builder.parse(myUrl.openStream());
        XPathFactory xPathfactory = XPathFactory.newInstance();
        XPath xpath = xPathfactory.newXPath();
        XPathExpression expr = xpath.compile("I have no idea what I should put here");
        String npsiValue = expr.evaluate(doc, XPathConstants.STRING).toString();
        System.out.println("NPSI: " + npsiValue );
    }
}

我试图在控制台上显示[reading type =“NPSI”value =“57”]内的值。

如果以前发过任何类似的问题,我真的很抱歉,但我已经查看了至少20个不同的结果,但没有设法理解或找到解决方案。 如果你能使用白痴解释,我们将不胜感激。 先谢谢你!


I am almost a complete beginner regarding XML, as well as having only very basic knowledge about Java. I have tried looking up many things the past day and trying many code snippets but have not yet found a solution, so I don't know if my search terms are wrong, or I'm just too confused.

I have this URL(http://www.example.com/api/WebAPI/?dataset=wanted_dataset&keyref=12345) to get XML data from and it returns:

<channel>
  <title>PSI Update</title>
  <source>Airviro</source>
 <item>
   <region>...</region>
   <region>...</region>
   <region>...</region>
   <region>
     <id>rEA</id>
     <latitude>1.35735</latitude>
     <longitude>103.94000</longitude>
     <record timestamp="20160210160000">
       <reading type="NPSI" value="57"/>
       <reading type="NPSI_PM25_3HR" value="56"/>
       <reading type="NO2_1HR_MAX" value="5"/>
       <reading type="PM10_24HR" value="32"/>
       <reading type="PM25_24HR" value="18"/>
       <reading type="SO2_24HR" value="4"/>
       <reading type="CO_8HR_MAX" value="0.53"/>
       <reading type="O3_8HR_MAX" value="31"/>
       <reading type="NPSI_CO" value="5"/>
       <reading type="NPSI_O3" value="13"/>
       <reading type="NPSI_PM10" value="32"/>
       <reading type="NPSI_PM25" value="57"/>
       <reading type="NPSI_SO2" value="2"/>
   </record>
 </region>
<region>...</region>
<region>...</region>

And this is my code so far:

public class HazeCheck {

    public void getHazeLevel() throws Exception{            
        URL myUrl = new URL("http://www.example.com/api/WebAPI/?dataset=wanted_dataset&keyref=12345");
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document doc = builder.parse(myUrl.openStream());
        XPathFactory xPathfactory = XPathFactory.newInstance();
        XPath xpath = xPathfactory.newXPath();
        XPathExpression expr = xpath.compile("I have no idea what I should put here");
        String npsiValue = expr.evaluate(doc, XPathConstants.STRING).toString();
        System.out.println("NPSI: " + npsiValue );
    }
}

I'm trying to display the value inside [reading type="NPSI" value="57"] on the console.

I'm really sorry if any similar questions have been posted before, but I've looked through at least 20 different results but did not manage to understand or find a solution. It would be greatly appreciated if you could use idiot-proof explanations. Thank you in advance!


原文:https://stackoverflow.com/questions/35317462
更新时间:2019-11-29 02:16

最满意答案

w3c-specs并不总是那么容易理解。 一个更简单的解释是在这里找到十分钟的XPath教程

如果您想尝试表达式,可以在此处执行: http//www.xpathtester.com/xpath

例如

/channel/item/region/record/reading[@type='NPSI_SO2']/@value

会给你2个结果。


The w3c-specs are not always that easy to understand. A more simple explanation is to be found here Ten minute XPath tutorial

If you want to try your expression you can do it here: http://www.xpathtester.com/xpath

For example

/channel/item/region/record/reading[@type='NPSI_SO2']/@value

will give you 2 as a result.

2016-02-10

相关文章

更多

最新问答

更多
  • jsPlumb draggable element javascript函数(jsPlumb draggable element javascript function)
  • MVC4:ViewModel(带有radiobuttonlist)在HttpPost之后为空(MVC4: ViewModel (with radiobuttonlist) is empty after HttpPost)
  • 如何在同一帐户上设置“Dev repo”(在prod和团队之间)(How to set up a “Dev repo” (between the prod and the team) on the same account)
  • 如何在tcl中将eth0配置为发送方udp端口(how to configure eth0 as a sender udp port in tcl)
  • 如何在datarow []中的列中找到最大值?(How to find max value in a column in a datarow[] ?)
  • 如何使用预定义文本替换来自数据库的部分结果(How do I replace part of result coming from Database with predefined text)
  • Selenium Java注入了新的Javascript函数(Selenium Java inject new Javascript function)
  • 使用.on的多个下拉菜单选择文本仅适用于第一个下拉列表(Multiple Dropdowns Menu Selection text using .on works only on first dropdown)
  • 快速将黄土曲线添加到大型数据集图中的方法(Quick way to add loess curve to large data set graph)
  • FilteringSelect in mvc(FilteringSelect in mvc)
  • 在Delphi XE2中开发Mac或iOS应用程序需要哪些硬件/软件?(What hardware/software is necessary to develop Mac or iOS apps in Delphi XE2?)
  • 在原型的构造函数中初始化属性时获取“未定义”(Getting 'undefined' when a property is initialized in the constructor of a prototype)
  • 通过越狱加载的应用程序的Documents文件夹位置(Location of Documents folder for an app loaded via jailbreak)
  • 在OpenGL中使用可编程和固定管道功能(Using both programmable and fixed pipeline functionality in OpenGL)
  • 将任何用户输入重定向到单独的底层程序(redirect any user input to a separate underlying program)
  • 编辑文本不能正常工作android(Edit texts not working properly android)
  • “user_denied”Facebook应用页面上的Facebook用户区域设置(Facebook user locale on “user_denied” facebook app page)
  • 在大图像中找到小的部分透明图像的坐标(find coordinates of small partially-transparent image within a large image)
  • 我如何在cakephp 3.1中获得完整的相对路径?(How i can get full relative path of image in cakephp 3.1?)
  • 如何保存拖动标记的新本地化?(How to save new localization of dragged marker?)
  • MySQL UPDATE vs INSERT和DELETE(MySQL UPDATE vs INSERT and DELETE)
  • 在执行查询之前,在SQLAlchemy模型中将datetime转换为unix时间戳?(Convert datetime to unix timestamp in SQLAlchemy model before executing query?)
  • OpenCL与OpenGL互操作的优势(Advantage of OpenCL interoperability with OpenGL)
  • 如何解析用点和等分隔的数据然后添加到listview(How to parsing data from delimited with dot and equal then add to listview)
  • 带调试输出的X3解析器段错误(BOOST_SPIRIT_X3_DEBUG)(X3 parser segfaults with debug output (BOOST_SPIRIT_X3_DEBUG))
  • 将文件夹名称添加到fgrep结果(Add folder name to fgrep result)
  • 在MySQL中加载一个表是非常慢的(Loading one table in MySQL is ridiculously slow)
  • 如何将JSON放入PHP变量?(How do I put JSON into a PHP Variable?)
  • 如何绕过Microsoft.Speech.Recognition中的不流畅?(How to bypass disfluencies in Microsoft.Speech.Recognition?)
  • 原点的最后一行是什么?(What is the last row of an origin for?)