//div[@id='foo']在GPath中,这个XPath的替代方法是什么?一般来说,我可以在哪里找到这份文件?
鉴于以下JSON,我想提取postal_code(long_name或short_name).我已经使用JsonSlurper将其摄取到变量中并使用find/contains/etc尝试了各种查询.抓住在"类型"中有"postal_code"但仍无法解决的节点.任何帮助是极大的赞赏.
{
"results" : [
{
"address_components" : [
{
"long_name" : "Jefferson Ave",
"short_name" : "Jefferson Ave",
"types" : [ "route" ]
},
{
"long_name" : "North Newport News",
"short_name" : "North Newport News",
"types" : [ "neighborhood", "political" ]
},
{
"long_name" : "Newport News",
"short_name" : "Newport News",
"types" : [ "locality", "political" ]
},
{
"long_name" : "Virginia",
"short_name" : "VA",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "United States",
"short_name" : "US", …Run Code Online (Sandbox Code Playgroud) 我需要从一些已解析的HTML(转换为XML)中的body节点中删除属性.
我遇到的情况是,我正在使用字符串查询 MongoDB,以查找对象层次结构中超过一级深度的字段。此查询必须是字符串。例如,我在 Groovy 中查询类似的内容:
def queryField = 'a.b.c' //this is variable and can be different every time
def result = mongodb.collection.findOne([queryField:5])
Run Code Online (Sandbox Code Playgroud)
问题不会出现,在结果中我想找到嵌套字段的值。有了 GPath,我可以深入一层并获得 a 的值
def aObj = result."a" //or result["a"]
Run Code Online (Sandbox Code Playgroud)
然而,我想通过做这样的事情来更深入:
def queryField = "a.b.c" //this can change every time and is not always 'a.b.c'
def cObj = result[queryField] //since field is variable, can't just assume result.a.b.c
Run Code Online (Sandbox Code Playgroud)
目前这在 Groovy 中不起作用。这里记录了一个错误,但我想知道是否有更好的解决方法可以用于这种情况,它比我通过在点上拆分来解析字符串然后构建对象遍历要干净一些。请注意,“abc”在运行时是可变且未知的(例如,它可能是“abd”)。
我的GPathResult可以使用3种方式之一的名称节点
1)名称节点存在并且具有值ex:John
2)名称节点存在,但没有值.
3)根本没有名称节点.
在Groovy代码中,我如何使用我的Gpathresult区分上述3个案例.我是否使用像gPathResult这样的东西.value()!= null?
Pesudo代码:
if(name node is present and has a value){
do this
}
if(name node exists, but has no value in it){
do this
}
if( No name node exists at all){
do this
}
Run Code Online (Sandbox Code Playgroud) 我正在GPathResult转向String使用
def gPathResult = new XmlSlurper().parseText('<node/>')
XmlUtil.serialize(gPathResult)
Run Code Online (Sandbox Code Playgroud)
它工作正常,但我在XML前面得到XML声明
<?xml version="1.0" encoding="UTF-8"?><node/>
Run Code Online (Sandbox Code Playgroud)
如何在一开始GPathResult就String没有转换<?xml version="1.0" encoding="UTF-8"?>?
如何从已解析的html文档中选择给定其索引的特定元素.
例如: ...
<div>div1</div>
<div>div2</div>
Run Code Online (Sandbox Code Playgroud)
我想选择第二个,div但在我看来GPath不提供像Xpath那样的解决方案.
如何获得 GPathResult 的下一个兄弟?例如,我有以下代码:
def priorityIssue = xmlReport.'**'.find { Issue ->
Issue.Priority.text() == priority
}
Run Code Online (Sandbox Code Playgroud)
我如何获得 priorityIssue 的下一个兄弟姐妹?
谢谢!
查找 GPath 表达式以使用属性名称获取属性值列表:
def xmltxt = """<reports>
<report category="weather">sunny</report>
<report category="sports">golf</report>
<report category="business">
<subreport category="deals">wallstreet</subreport>
</report>
<report>NA</report>
<report category="life">gossip</report>
</reports>"""
Run Code Online (Sandbox Code Playgroud)
..当搜索所有category属性时,我想找回它,无论category属性存在于文档中的位置:
[weather, sports, business, deals, life]
...但是我所有的尝试检索的内容都超出了我想要的内容,似乎它返回的节点没有category属性;我可以从列表中删除空元素,但我想知道为什么会发生这种情况。
[, weather, sports, business, deals, , life]
def names = xml.'**'.findAll{
it.@category
}.collect{
it.@category
}
Run Code Online (Sandbox Code Playgroud) 在groovy中使用XmlParser().请参阅以下代码.当name的值是type时,我需要打印answer的值.
<root>
<foo name = 'type' answer = 'car'/>
<foo name = 'color' answer = 'red'/>
<foo name = 'size' answer = 'big'/>
</root>
Run Code Online (Sandbox Code Playgroud)
我需要做这样的事情:
def XML = new XmlParser().parseText(XMLstring)
println XML.root.foo.[where @name = 'type'].@answer
Run Code Online (Sandbox Code Playgroud) 需要解析包含标头上下文中的属性的 XML 文档。
<?xml version="1.0" encoding="UTF-8"?>
<S38:manageRequest xmlns:S38="http://ns.com/S38" xmlns:header="http://ns.com/header/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ns.com/xsd/ManageItem XSD\ManageItem.xsd">
<header:standardHeader>
<header:serviceAddressing>
<header:to>
<header:address>http://ns.com/BLAHBLAH</header:address>
<header:contextItemList>
<header:contextItem contextName="Channel" contextId="http://ns.com/contextItem">I Need This</header:contextItem>
<header:contextItem contextName="Box" contextId="http://ns.com/contextItem">Blue</header:contextItem>
</header:contextItemList>
</header:to>
</header:serviceAddressing>
</header:standardHeader>
</S38:manageRequest>
Run Code Online (Sandbox Code Playgroud)
我想使用 获取“我需要这个”的属性“频道”值groovy.util.slurpersupport.GPathResult。
我找到了一种可行的方法,但我不相信它是正确的,因为我正在选择contextItem,幸运的是第一个是我感兴趣的:
private Map parseServiceAddressing(GPathResult message,Map values){
def serviceAddressingList=message."standardHeader"."serviceAddressing"."to"."contextItemList";
if(serviceAddressingList.isEmpty()){
throw new sourceException("serviceAddressing list is missing",values);
}
def contextItem=serviceAddressingList.'*'.find{
it.name()=='contextItem'
};
values.put(tag.CHANNEL, contextItem);
return values;
Run Code Online (Sandbox Code Playgroud)
所有用作Channel位置文本的尝试都无法检索到值。不幸的是,我必须使用 GPath,因为它是一个非常大的 Groovy 脚本的一部分,我被要求修改它,它可以做很多其他的事情。
有人可以告诉我实现这一目标的正确方法是什么吗?
gpath ×11
groovy ×11
xml ×6
xmlslurper ×3
xpath ×3
java ×2
grails ×1
json ×1
mongodb ×1
xml-parsing ×1