标签: xmlslurper

Groovy XmlSlurper与XmlParser

我在这个主题上搜索了一段时间,并发现了一些结果,我在帖子的末尾提到了.对于下面列出的案例,有人可以帮我准确回答这三个问题吗?

  1. 对于哪些使用XmlSluper的用例比XmlParser更有意义,反之亦然(从易用性API /语法的角度来看)?

  2. 哪一个更有内存效率?(看起来像Slurper)

  3. 哪一个处理xml更快?

案例a.什么时候我必须读取xml中的几乎所有节点?

案例b.什么时候我只需要读几个节点(比如使用gpath表达式)?

案例c.什么时候我必须更新/转换xml?

前提是xml文档不是一般的(具有xml的深度和大小).

资源:

http://www.tutkiun.com/2009/10/xmlparser-and-xmlslurper.html指出:

XMLParser和XMLSlurper之间的区别:

XMLParser和XMLSlurper在用于简单阅读时有相似之处,但是当我们使用它们进行高级阅读时,以及在处理其他格式的XML文档时,两者之间存在差异.

XMLParser在解析文档后存储中间结果.但另一方面,

处理XML文档后,XMLSlurper不存储内部结果.

在处理解析的信息时,真正的基本差异变得明显.这是在流式场景中使用直接就地数据处理和处理进行处理的时候.

http://groovy.dzone.com/news/john-wilson-groovy-and-xml

groovy doc(XmlParser,XmlSlurper)和groovy的网站很好地解释了它们(这里这里),但在解释上述问题方面做得并不好.

xml groovy xmlslurper xml-parsing

75
推荐指数
2
解决办法
2万
查看次数

如何使用Groovy的XmlSlurper检查元素是否存在?

我正在尝试确定Groovy的XmlSlurper是否存在XML元素.有没有办法做到这一点?例如:

<foo>
  <bar/>
</foo>
Run Code Online (Sandbox Code Playgroud)

如何检查条形元素是否存在?

xml groovy xmlslurper

32
推荐指数
2
解决办法
3万
查看次数

如何解决Groovy的XmlSlurper由于DOCTYPE和DTD限制而拒绝解析HTML?

我正在尝试复制HTML覆盖率报告中的元素,因此覆盖总计显示在报告的顶部以及底部.

因此HTML开始,我认为格式良好:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
  <head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
    <link rel="stylesheet" href=".resources/report.css" type="text/css" />
    <link rel="shortcut icon" href=".resources/report.gif" type="image/gif" />
    <title>Unified coverage</title>
    <script type="text/javascript" src=".resources/sort.js"></script>
  </head>
  <body onload="initialSort(['breadcrumb', 'coveragetable'])">
Run Code Online (Sandbox Code Playgroud)

Groovy的XmlSlurper抱怨如下:

doc = new XmlSlurper( /* false, false, false */ ).parse("index.html")
[Fatal Error] index.html:1:48: DOCTYPE is disallowed when the feature "http://apache.org/xml/features/disallow-doctype-decl" set to true.
DOCTYPE is disallowed when the feature "http://apache.org/xml/features/disallow-doctype-decl" set to true.
Run Code Online (Sandbox Code Playgroud)

启用DOCTYPE:

doc = new …
Run Code Online (Sandbox Code Playgroud)

html groovy xmlslurper

20
推荐指数
2
解决办法
9158
查看次数

tag0名称空间为默认名称空间中的元素添加

我正在尝试使用Groovy的XmlSlurper解析和修改Maven的pom.xml.我的pom.xml声明了名称空间xsi.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
     http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>a-group-id</groupId>
<artifactId>an-artifact-id</artifactId>
Run Code Online (Sandbox Code Playgroud)

我的Groovy源代码如下:

import groovy.xml.XmlUtil
def pom = new XmlSlurper().parse('pom.xml')
   .declareNamespace('': 'http://maven.apache.org/POM/4.0.0',
      xsi: 'http://www.w3.org/2001/XMLSchema-instance')
//manipulate the pom
println XmlUtil.serialize(pom)
Run Code Online (Sandbox Code Playgroud)

正如您所注意到的,我已将第一个命名空间声明为空.但是在输出中,tag0随处可见.

<?xml version="1.0" encoding="UTF-8"?>
<tag0:project xmlns:tag0="http://maven.apache.org/POM/4.0.0"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
      http://maven.apache.org/maven-v4_0_0.xsd">
<tag0:modelVersion>4.0.0</tag0:modelVersion>
<tag0:groupId>a-group-id</tag0:groupId>
<tag0:artifactId>an-artifact-id</tag0:artifactId>
Run Code Online (Sandbox Code Playgroud)

怎么避免呢?

目前我的解决方法是手动删除标签:

println XmlUtil.serialize(pom).replaceAll('tag0:', '').replaceAll(':tag0', '')
Run Code Online (Sandbox Code Playgroud)

xml groovy parsing xmlslurper

17
推荐指数
1
解决办法
5475
查看次数

Groovy XmlSlurper:在XML结构中查找元素

假设有以下XML结构:

<Data>
    <DataFieldText>
        <DataFieldName>Field #1</DataFieldName>
        <DataFieldValue>1</DataFieldValue>
    </DataFieldText>
    <DataFieldText>
        <DataFieldName>Field #2</DataFieldName>
        <DataFieldValue>2</DataFieldValue>
    </DataFieldText>
    <DataFieldText>
        <DataFieldName>Field #3</DataFieldName>
        <DataFieldValue>3</DataFieldValue>
    </DataFieldText>
</Data>
Run Code Online (Sandbox Code Playgroud)

使用Groovy XmlSlurper我需要执行以下操作:

Data找到包含元素中的值Field #1<DataFieldName>元素开始.如果找到则获取<DataFieldValue>属于同一级别的对应值.

xml groovy xmlslurper

12
推荐指数
1
解决办法
2万
查看次数

XmlSlurper.parse(uri)具有HTTP基本身份验证

我需要从XML-RPC Web服务中获取数据.

new XmlSlurper().parse("http://host/service") 工作正常,但现在我有一个特殊的服务,需要基本的HTTP身份验证.

如何为parse()方法设置用户名和密码,或修改请求的HTTP标头?

使用http://username:password@host/service没有帮助 - 我仍然得到java.io.IOException: Server returned HTTP response code: 401 for URL例外.

谢谢

groovy xmlslurper basic-authentication

10
推荐指数
1
解决办法
1万
查看次数

Groovys XmlSlurper中的命名空间处理

情况:

def str = """
  <foo xmlns:weird="http://localhost/">
    <bar>sudo </bar>
    <weird:bar>make me a sandwich!</weird:bar>
  </foo>
"""
def xml = new XmlSlurper().parseText(str)
println xml.bar
Run Code Online (Sandbox Code Playgroud)

这个片段的输出是

# sudo make me a sandwich!
Run Code Online (Sandbox Code Playgroud)

似乎解析器合并了<bar>和的内容<weird:bar>.

是否需要这种行为,如果是,我该如何避免这种情况并仅选择<bar><weird:bar>

xml grails groovy parsing xmlslurper

10
推荐指数
1
解决办法
1万
查看次数

Groovy:XMLSlurper的正确语法,用于查找具有给定属性的元素

给定一个HTML文件结构html - > body - >一堆div什么是正确的groovy语句,找到所有具有非空标签属性的div?

以下不起作用:

def nodes = html.body.div.findAll { it.@tags != null }
Run Code Online (Sandbox Code Playgroud)

因为它找到了所有节点.

groovy xmlslurper

9
推荐指数
1
解决办法
1万
查看次数

使用XmlSlurper:如何在迭代GPathResult时选择子元素

我正在编写一个HTML解析器,它使用TagSoup将格式良好的结构传递给XMLSlurper.

这是通用代码:

def htmlText = """
<html>
<body>
<div id="divId" class="divclass">
<h2>Heading 2</h2>
<ol>
<li><h3><a class="box" href="#href1">href1 link text</a> <span>extra stuff</span></h3><address>Here is the address<span>Telephone number: <strong>telephone</strong></span></address></li>
<li><h3><a class="box" href="#href2">href2 link text</a> <span>extra stuff</span></h3><address>Here is another address<span>Another telephone: <strong>0845 1111111</strong></span></address></li>
</ol>
</div>
</body>
</html>
"""     

def html = new XmlSlurper(new org.ccil.cowan.tagsoup.Parser()).parseText( htmlText );

html.'**'.grep { it.@class == 'divclass' }.ol.li.each { linkItem ->
    def link = linkItem.h3.a.@href
    def address = linkItem.address.text()
    println "$link: $address\n"
}
Run Code Online (Sandbox Code Playgroud)

我希望每个人都允许我依次选择每个'li',这样我就可以检索相应的href和地址细节.相反,我得到这个输出:

#href1#href2: Here is the addressTelephone number: …
Run Code Online (Sandbox Code Playgroud)

html groovy parsing xmlslurper

8
推荐指数
1
解决办法
1万
查看次数

使用XmlSlurper时出现MalformedURLException

我在groovy中有以下代码片段:

s = '''
<html>
<head>
<title>My title</title>
</head>
<body>
This is body!
</body>
</html>'''

new XmlSlurper().parse(s)
Run Code Online (Sandbox Code Playgroud)

它给出了以下例外:

java.net.MalformedURLException: no protocol: 
<html>
<head>
<title>My title</title>
</head>
<body>
This is body!
</body>
</html>
    at java.net.URL.<init>(URL.java:586)
    at java.net.URL.<init>(URL.java:483)
    at java.net.URL.<init>(URL.java:432)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:613)
    at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:189)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:812)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:649)
    at groovy.util.XmlSlurper.parse(XmlSlurper.java:147)
    at groovy.util.XmlSlurper.parse(XmlSlurper.java:213)
    at groovy.util.XmlSlurper$parse.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
    at ConsoleScript12.run(ConsoleScript12:11)
    at groovy.lang.GroovyShell.runScriptOrMainOrTestOrRunnable(GroovyShell.java:257)
    at groovy.lang.GroovyShell.run(GroovyShell.java:481)
    at groovy.lang.GroovyShell.run(GroovyShell.java:163)
    at groovy.lang.GroovyShell$run.call(Unknown Source)
    at groovy.ui.Console$_runScriptImpl_closure17.doCall(Console.groovy:955)
    at groovy.ui.Console$_runScriptImpl_closure17.doCall(Console.groovy) …
Run Code Online (Sandbox Code Playgroud)

html xml groovy xmlslurper

8
推荐指数
1
解决办法
3215
查看次数