如何解析XML in Google Refine 来提取数据?
How to parse XML in Google Refine to extract data?
我需要使用 Google Refine 解析一个 XML 以从中提取一些数据。
XML是这样的
<wfs:FeatureCollection xsi:schemaLocation="http://mapserver.gis.umn.edu/mapserver http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/wfs/Numeri_Civici_2012.map&SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&TYPENAME=IN.NUMERICIVICI.2012&OUTPUTFORMAT=text/xml;%20subtype=gml/3.1.1 http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd"><gml:boundedBy><gml:Envelope srsName="EPSG:4326"><gml:lowerCorner>45.808287 9.575815</gml:lowerCorner><gml:upperCorner>45.808287 9.575815</gml:upperCorner></gml:Envelope></gml:boundedBy><gml:featureMember><ms:IN.NUMERICIVICI.2012 gml:id="IN.NUMERICIVICI.2012.1225789"><gml:boundedBy><gml:Envelope srsName="EPSG:4326"><gml:lowerCorner>45.808287 9.575815</gml:lowerCorner><gml:upperCorner>45.808287 9.575815</gml:upperCorner></gml:Envelope></gml:boundedBy><ms:boundary><gml:Point srsName="EPSG:4326"><gml:pos>45.808287 9.575815</gml:pos></gml:Point></ms:boundary><ms:id>13800026062251</ms:id><ms:nome>Via Milano</ms:nome><ms:civico>55</ms:civico><ms:istat>03016023</ms:istat><ms:cap>24030</ms:cap><ms:comune>BERBENNO</ms:comune><ms:nome_ted> </ms:nome_ted><ms:provincia>BERGAMO</ms:provincia><ms:regione>LOMBARDIA</ms:regione></ms:IN.NUMERICIVICI.2012></gml:featureMember></wfs:FeatureCollection>
我想提取关于这个标签的坐标
<gml:Point srsName="EPSG:4326"><gml:pos>45.808287 9.575815</gml:pos></gml:Point>
所以两个不同字段中的单个数字 45.808287 和 9.575815
我试过
value.parseHtml().select("Point|pos")......
但我不知道如何继续。
有什么建议吗?
我找到了解决方案...这就是...
toNumber(split(trim(substring(value.parseHtml().select("gml|Point gml|pos")[0].toString(),10, -10)), " ")[0])
和
toNumber(split(trim(substring(value.parseHtml().select("gml|Point gml|pos")[0].toString(),10, -10)), " ")[1])
这些链接对于这些东西非常有用....
恭喜您自行找到解决方案(并将其与参考资料一起发布,以造福他人)。
实际上我建议稍微改变一下:
value.parseHtml().select('gml|Point gml|pos')[0].htmlText().trim().split(' ')[0].toNumber()
主要的重要区别是使用 htmlText()
提取文本内容,而不是将元素转换为字符串(带有标签),然后使用固定的子字符串删除标签。
我做的另一个纯粹风格上的改变是使用函数链接,这样操作顺序是从左到右而不是从内到外。
我包含的 trim()
在您的示例中不是必需的,但我将其包含在内是为了保持良好的卫生习惯。最小版本为:
value.parseHtml().select('gml|Point gml|pos')[0].htmlText().split(' ')[0].toNumber()
value.parseHtml().select('gml|Point gml|pos')[1].htmlText().split(' ')[0].toNumber()
您还可以使用 forEach
运算符获取数组中的坐标,如果这对您的用例更有用的话:
forEach(value.parseHtml().select('gml|Point gml|pos')[0].htmlText().split(' '), n, n.toNumber())
我需要使用 Google Refine 解析一个 XML 以从中提取一些数据。
XML是这样的
<wfs:FeatureCollection xsi:schemaLocation="http://mapserver.gis.umn.edu/mapserver http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/wfs/Numeri_Civici_2012.map&SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&TYPENAME=IN.NUMERICIVICI.2012&OUTPUTFORMAT=text/xml;%20subtype=gml/3.1.1 http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd"><gml:boundedBy><gml:Envelope srsName="EPSG:4326"><gml:lowerCorner>45.808287 9.575815</gml:lowerCorner><gml:upperCorner>45.808287 9.575815</gml:upperCorner></gml:Envelope></gml:boundedBy><gml:featureMember><ms:IN.NUMERICIVICI.2012 gml:id="IN.NUMERICIVICI.2012.1225789"><gml:boundedBy><gml:Envelope srsName="EPSG:4326"><gml:lowerCorner>45.808287 9.575815</gml:lowerCorner><gml:upperCorner>45.808287 9.575815</gml:upperCorner></gml:Envelope></gml:boundedBy><ms:boundary><gml:Point srsName="EPSG:4326"><gml:pos>45.808287 9.575815</gml:pos></gml:Point></ms:boundary><ms:id>13800026062251</ms:id><ms:nome>Via Milano</ms:nome><ms:civico>55</ms:civico><ms:istat>03016023</ms:istat><ms:cap>24030</ms:cap><ms:comune>BERBENNO</ms:comune><ms:nome_ted> </ms:nome_ted><ms:provincia>BERGAMO</ms:provincia><ms:regione>LOMBARDIA</ms:regione></ms:IN.NUMERICIVICI.2012></gml:featureMember></wfs:FeatureCollection>
我想提取关于这个标签的坐标
<gml:Point srsName="EPSG:4326"><gml:pos>45.808287 9.575815</gml:pos></gml:Point>
所以两个不同字段中的单个数字 45.808287 和 9.575815
我试过
value.parseHtml().select("Point|pos")......
但我不知道如何继续。
有什么建议吗?
我找到了解决方案...这就是...
toNumber(split(trim(substring(value.parseHtml().select("gml|Point gml|pos")[0].toString(),10, -10)), " ")[0])
和
toNumber(split(trim(substring(value.parseHtml().select("gml|Point gml|pos")[0].toString(),10, -10)), " ")[1])
这些链接对于这些东西非常有用....
恭喜您自行找到解决方案(并将其与参考资料一起发布,以造福他人)。
实际上我建议稍微改变一下:
value.parseHtml().select('gml|Point gml|pos')[0].htmlText().trim().split(' ')[0].toNumber()
主要的重要区别是使用 htmlText()
提取文本内容,而不是将元素转换为字符串(带有标签),然后使用固定的子字符串删除标签。
我做的另一个纯粹风格上的改变是使用函数链接,这样操作顺序是从左到右而不是从内到外。
我包含的 trim()
在您的示例中不是必需的,但我将其包含在内是为了保持良好的卫生习惯。最小版本为:
value.parseHtml().select('gml|Point gml|pos')[0].htmlText().split(' ')[0].toNumber()
value.parseHtml().select('gml|Point gml|pos')[1].htmlText().split(' ')[0].toNumber()
您还可以使用 forEach
运算符获取数组中的坐标,如果这对您的用例更有用的话:
forEach(value.parseHtml().select('gml|Point gml|pos')[0].htmlText().split(' '), n, n.toNumber())