我正在使用Groovy的方便的MarkupBuilder从各种源数据构建HTML页面.
我正在努力做的一件事是构建一个HTML表并将不同的样式类应用于第一行和最后一行.这可能是最好的例子......
table() {
thead() {
tr(){
th('class':'l name', 'name')
th('class':'type', 'type')
th('description')
}
}
tbody() {
// Add a row to the table for each item in myList
myList.each {
tr('class' : '????????') {
td('class':'l name', it.name)
td('class':'type', it.type)
td(it.description)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
在本<tbody>
节中,我想<tr>
根据当前项目myList
是第一项还是最后一项来将元素的类设置为不同的类.
是否有一个很好的Groovy-ified方法来做到这一点,而不是使用手动来检查项目索引与列表大小使用类似的东西eachWithIndex{}
?
我想用Groovy MarkupBuilder在我的xml文档中插入注释.这怎么可能?
我正在尝试使用Groovy MarkupBuilder生成XML.
所需的XML是这种形式(简化):
<Order>
<StoreID />
<City />
<Items>
<Item>
<ItemCode />
<UnitPrice />
<Quantity />
</Item>
</Items>
</Order>
Run Code Online (Sandbox Code Playgroud)
数据存储在Excel文件中,易于访问.我的Groovy脚本解析Excel并生成XML.
例如
import groovy.xml.*
def writer = new StringWriter()
def xml = new MarkupBuilder(writer)
xml.Order{
StoreID("Store1")
City("New York")
Items(){
Item(){
ItemCode("LED_TV")
UnitPrice("800.00")
Quantity("2")
}
}
}
Run Code Online (Sandbox Code Playgroud)
"items"中可以有多个"item"容器.
我的问题是:假设我们要生成包含10个项目的Order XML.有没有办法在"items"容器中写一个类似for循环的东西?这样,我们就不需要为10个不同的项目编写MarkupBuilder代码.
有一个类似的问题将动态元素和属性添加到groovy MarkupBuilder或StreamingMarkupBuilder.但它没有讨论循环.
我已经看到很多使用Groovy MarkupBuilder
构建XML文档的例子,但它们似乎都对文档中的每个元素使用静态属性(属性名称在编译时都是已知的).如果我正在尝试构建一个XML文档,其中在运行时之前不知道属性名称,该怎么办?我还没有想出解决这样的问题的语法要求.
我正在使用Groovy 1.8 XML MarkupBuilder来构建包含<script>
标记的HTML页面.
当我在Firefox 18中加载页面时,我看到一个空白页而不是预期的结果.
这似乎是由于生成的<script>
标签没有补充</script>
标签,即使没有内容可以保证</script>
标签.(参见:https://stackoverflow.com/questions/69913/why-dont-self-closing-script-tags-work)
样本Groovy代码:
def builder = new groovy.xml.MarkupBuilder( out )
builder.html {
head {
script( type:'text/javascript', src:'//example.com/example.js' )
}
body {
p("Hello...Newman.")
}
}
Run Code Online (Sandbox Code Playgroud)
如果我使用Firefox的"查看页面源"(Ctrl-U)检查(空白)呈现页面的HTML,我看到:
<html>
<head>
<script type='text/javascript' src='//example.com/example.js />
</head>
<body>
<p>Hello...Newman.</p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
仔细观察,我看到<script ... />
标签上的'/' 呈现为红色,'/'上的悬停文本表示在非空HTML元素上使用的"自闭语法("/>").忽略斜线和处理作为开始标记."
那么,如何<script>
使用Groovy XML MarkupBuilder 生成有效的HTML 标记?
我想要以下输出:
<?xml version="1.0" encoding="UTF-8"?>
<structure:structuralDataRoot xmlns:register="http://www.test.ch/register/1" xmlns:structure="http://test.ch/structure/1" >
<structure:tester>ZH</structure:tester>
<structure:surveyYear>2001</structure:surveyYear>
<structure:surfaceData>
<structure:houseSurfaceData>
<structure:creationDate>2001-01-01</structure:creationDate>
<structure:localFarmId>
<register:houseIdCategory>token</register:houseIdCategory>
<register:houseId>token</register:houseId>
</structure:localFarmId>
</structure:houseSurfaceData>
</structure>
Run Code Online (Sandbox Code Playgroud)
我可以将命名空间添加到xml中,如下所示:
xml.records('xmlns:structure' :"http://test.ch/structure/1" ...
Run Code Online (Sandbox Code Playgroud)
但是我如何为xml元素创建名称空间前缀?我找到的唯一解决方案是:
tester('xmlns:structure' :"http://test.ch/structure/1", 'ZH')
Run Code Online (Sandbox Code Playgroud)
但这给了我以下输出:
<tester xmlns:structure='http://test.ch/structure/1'>ZH</tester>
Run Code Online (Sandbox Code Playgroud)
它的语法是正确的,但是当你有很多节点时阅读并不好.
我有这个代码:
String buildCatalog(Catalog catalog) {
def writer = new StringWriter()
def xml = new MarkupBuilder(writer)
xml.catalog(xmlns:'http://www.sybrium.com/XMLSchema/NodeCatalog') {
'identity'() {
groupId(catalog.groupId)
artifactId(catalog.artifactId)
version(catalog.version)
}
}
return writer.toString();
}
Run Code Online (Sandbox Code Playgroud)
它产生这个xml:
<catalog xmlns='http://www.sybrium.com/XMLSchema/NodeCatalog'>
<groupId>sample.group</groupId>
<artifactId>sample-artifact</artifactId>
<version>1.0.0</version>
</catalog>
Run Code Online (Sandbox Code Playgroud)
请注意,"身份"标签丢失了...我已经尝试了世界上的所有内容来显示该节点.我正在撕开我的头发!
提前致谢.
我是Groovy的新手,我遇到了一个简单的问题.我想做的就是从一个XML文件中提取某些元素并用它创建一个新文件.这是一个示例XML,让我们使用Maven pom文件:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.group</groupId>
<artifactId>artifact</artifactId>
<version>1.4</version>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
Run Code Online (Sandbox Code Playgroud)
我知道如何在Groovy中解析XML:
def project = new XmlParser().parse("pom.xml")
project.groupId.each{
println it.text()
}
Run Code Online (Sandbox Code Playgroud)
我也知道如何在Groovy中创建XML:
def xml = new groovy.xml.MarkupBuilder()
xml.project (){
modelVersion("artifactId")
groupId("com.group")
artifactId("artifact")
}
Run Code Online (Sandbox Code Playgroud)
但是,我似乎把这两者结合起来有问题.例如,我想要使用groupId,artifactId和整个依赖树,并从中创建一个新的XML.它不是那么难,我想利用Groovy的简单性.
沿着这些方向的东西(当然这不起作用):
def newXml= new groovy.xml.MarkupBuilder()
newXml.groupId= project.groupId
newXml.dependencies = project.dependencyManagement.dependencies
Run Code Online (Sandbox Code Playgroud)
谢谢.该代码有很多帮助,但我如何处理命名空间,即输入中的项目标记如下:
<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/xsd/maven-4.0.0.xsd">
Run Code Online (Sandbox Code Playgroud)
然后它会在输出中添加一些奇怪的注释.我想要的只是输出中的项目标签也是如此.
(对不起奇怪的标题......)
我想使用groovy构建器系统来创建一个xml.
我的问题是,我希望有一些信封,用户不必关心.
一个例子:
def builder = new groovy.xml.MarkupBuilder()
builder.foo() {
bar('hello')
}
Run Code Online (Sandbox Code Playgroud)
这应该创造让我们说
<Something id:'123'>
<AnyInfo>
<foo>
<bar>hello</bar>
</foo>
</AnyInfo>
</Something>
Run Code Online (Sandbox Code Playgroud)
这样在后台有一个xml结构,用户可以在预定义的节点上添加他的xml结构(例如'AnyInfo')
构建器的外观如何,我可以在信封中间的某处添加带有markupbuilder(或任何其他构建器)的节点?
我希望这在某种程度上是可以理解的?!
谢谢马蒂
我在groovy中使用MarkupBuilder创建了一个xml但是如何将它写入我的项目目录中的xml文件中 E:\tomcat 5.5\webapps\csm\include\xml
def writer = new StringWriter()
def xml = new MarkupBuilder(writer)
String[] splitted
xml.rows()
{ for(int i=0;i<lines.length-1;i++){
row()
{
for(int j=0;j<lines[i].length();j++)
{
splitted= lines[i].split(',');
}
name(splitted[0])
email(splitted[1])
}
}
}
Run Code Online (Sandbox Code Playgroud)
这里println writer.toString()
打印我的整个xml内容,但我需要它在我的tomcat项目xml
目录中的文件中
我似乎无法弄清楚如何创建非硬编码的节点.例:
def aval = "someValue"
def xml = new MarkupBuilder()
xml.outTag(attr: aval) // outTag is hardcoded
Run Code Online (Sandbox Code Playgroud)
我的问题是:如果我不知道节点的名称怎么办(就像在我的例子中,如果我想让outTag成为变量怎么办).当我读取目录/文件并从中创建XML时,我正在使用它.谢谢.
我有以下大量代码用于写出一系列按钮元素,包含图标和文本:
def tagcloud = { attrs, body ->
def mb = new MarkupBuilder(out)
mb.ul('class': 'list-inline') {
def tag = it
attrs.tags.split(",").each {
li {
button('class': 'btn btn-default', 'type': 'submit') {
i('class': 'fa fa-tag', '')
mb.yield('test')
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我发现在使用yield函数时,标记生成器将yield调用作为我的html中的标记输出,而不是原始文本:
<li>
<button class="btn btn-default" type="submit">
<i class="fa fa-tag"></i>
<yield>test</yield>
</button>
</li>
Run Code Online (Sandbox Code Playgroud)
基于我的研究,这是推荐的方法:使用Groovy MarkupBuilder的HTML,如何优雅地混合标签和文本?
有谁知道为什么这个文字被包裹喜欢这个?
我使用的是Grails 2.3.8.
是否有一种简单的方法将a转换groovy.util.slurpersupport.Node
为groovy.util.Node
?
我试图XmlNodePrinter
在一个节点上使用,来XmlSlurper
进行一些快速调试.这是我的代码(可能不是最优雅的):
def xml = new XmlSlurper().parse( new File( path + pomFile ) )
def services = xml.build.plugins.plugin.configuration.services
services.children().findAll{ it.artifactId.text() == serviceName }.each { config ->
// begin section to dump "config" for debugging
def stringWriter = new StringWriter()
new XmlNodePrinter(new PrintWriter(stringWriter)).print(config[0])
println stringWriter.toString()
// end section to dump "config" for debugging
// do some other processing on the config node
}
Run Code Online (Sandbox Code Playgroud)
这会抛出以下内容config[0]
:
org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'groovy.util.slurpersupport.Node@14712c3' with class …
Run Code Online (Sandbox Code Playgroud) groovy ×13
markupbuilder ×13
xml ×9
html ×3
grails ×2
builder ×1
closures ×1
java ×1
markup ×1
namespaces ×1
taglib ×1
xml-parsing ×1