作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 XmlSlurper
解析一些 Android XML .对于给定的子节点,我想检测是否指定了具有特定命名空间的属性。
例如,在下面的 XML 中,我想知道 EditText
节点已经声明了来自“b”命名空间的任何属性:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:b="http://x.y.z.com">
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
b:enabled="true" />
</LinearLayout>
def rootNode = new XmlSlurper().parseText(text)
GPathResult
.当我遍历 child 时,我得到了一个
groovy.util.slurpersupport.NodeChild
的实例。 .在这个类中,我可以通过调用
attributes()
来检查属性。在
EditText
的情况下上面,这将返回以下 map :
[layout_width: "fill_parent", layout_height: "wrap_content", enabled: "true"]
.
最佳答案
您可以使用 XmlParser
而不是 XmlSlurper
并这样做:
def xml = '''<LinearLayout
| xmlns:android="http://schemas.android.com/apk/res/android"
| xmlns:b="http://x.y.z.com">
|
| <EditText
| android:layout_width="fill_parent"
| android:layout_height="wrap_content"
| b:enabled="true" />
|</LinearLayout>'''.stripMargin()
def root = new XmlParser().parseText( xml )
root.EditText*.attributes()*.each { k, v ->
println "$k.localPart $k.prefix($k.namespaceURI) = $v"
}
layout_width android(http://schemas.android.com/apk/res/android) = fill_parent
layout_height android(http://schemas.android.com/apk/res/android) = wrap_content
enabled b(http://x.y.z.com) = true
namespaceTagHints
使用反射来自根节点的属性:
def rootNode = new XmlSlurper().parseText(xml)
def xmlClass = rootNode.getClass()
def gpathClass = xmlClass.getSuperclass()
def namespaceTagHintsField = gpathClass.getDeclaredField("namespaceTagHints")
namespaceTagHintsField.setAccessible(true)
def namespaceDeclarations = namespaceTagHintsField.get(rootNode)
namespaceTagHints
是
GPathResult 的属性(property),它是
NodeChild
的父类(super class).
rootNode.EditText.nodeIterator().each { groovy.util.slurpersupport.Node n ->
n.@attributeNamespaces.each { name, ns ->
def prefix = namespaceDeclarations.find {key, value -> value == ns}.key
println "$name $prefix($ns) = ${n.attributes()"$name"}"
}
}
关于groovy - 如何确定NodeChild中给定属性的命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9104496/
是否可以在 groovy.util.slurpersupport.NodeChild在Grails中? AppendNode不起作用。 我必须使用xmlparser还是xmlslurper? 最好的祝
我想在控制台上打印来自外部提要的 xml。当我做的时候 log.debug "${xml}" 我在控制台上获得了 xml 值,但没有开始和结束标记。例如 apple orang
我正在使用 Grails XML Parser 来解析一个 XML 字符串,在获得解析的 NodeChild 实例后,我在该实例上添加动态方法,如下所示: import grails.converte
我正在尝试从我的 pom.xml 文件中读取属性。我尝试了以下方法并且有效: steps { script { def xmlfile = readFile "pom.xml"
我是一名优秀的程序员,十分优秀!