如果条目丢失,则使用 groovy 查找并添加内部级别子节点
Posted
技术标签:
【中文标题】如果条目丢失,则使用 groovy 查找并添加内部级别子节点【英文标题】:find and add inner level child node if entry is missing using groovy 【发布时间】:2012-11-12 06:57:03 【问题描述】:使用 groovy,如果节点 <Resource name="jdbc/testDS" auth="Container" ..... >
丢失,我正在尝试读取 tomcat server.xml 并插入新的节点资源标签。
Server.xml 的层次结构为 服务器 -> GlobalNamingResources -> 资源
尝试了两种方式:- 1)读取server.xml
groovy.util.XmlParser parser = new groovy.util.XmlParser();
println "tomcat.directory.path for server.xml >> " + "C:/Program Files/Apache Software Foundation/Tomcat 5.5/conf/server.xml"
def root = parser.parse( "C:/Program Files/Apache Software Foundation/Tomcat 5.5/conf/server.xml" )
datasourceToAdd = parser.parseText("<Resource name=\"jdbc/testDS\" auth=\"Container\" type=\"javax.sql.DataSource\" driverClassName=\"oracle.jdbc.OracleDriver\" url=\"jdbc:oracle:thin:@localhost:1521:ORA\" username=\"ORA_TEST\" password=\"*****\" factory=\"org.apache.commons.dbcp.BasicDataSourceFactory\" defaultAutoCommit=\"false\" maxActive=\"10\" maxIdle=\"5\" maxWait=\"30000\" whenExhaustedAction=\"1\" driver=\"oracle.jdbc.OracleDriver\"/>");
def nodeName = root.'**'.findAll it.name()== 'jdbc/testDS' ;
println "nodeName >>>>>>> " + nodeName;
if(!root.'**'.findAll it.name()== 'jdbc/testDS' )
root.find it.name() == 'GlobalNamingResources' .children().add( 0, fragmentToAdd )
String outxml = groovy.xml.XmlUtil.serialize( root )
println outxml
这里的问题是无法将数据写回 server.xml 并且条件也不正确。如果条件正确,则需要将xml写回文件,没有找到如何做到这一点。
2) 逐行读取 server.xml 并开始写入文件,如果找不到条目,则插入标签。这里也放置条件似乎有问题。
String cr = System.getProperty( "line.separator" );
File webXML = new File( "C:/Program Files/Apache Software Foundation/Tomcat 5.5/conf/server2.xml" )
try
FileInputStream fstream = new FileInputStream( "C:/Program Files/Apache Software Foundation/Tomcat 5.5/conf/server.xml" );
DataInputStream dataInputStream = new DataInputStream( fstream );
BufferedReader bufferedReader = new BufferedReader( new InputStreamReader( dataInputStream ) );
String strLine;
//Read File Line By Line
while ( ( strLine = bufferedReader.readLine() ) != null )
println ">>>>>" + strLine;
if(!strLine.contains("jdbc/testDS"))
webXML.append( strLine + cr );
dataInputStream.close();
AntBuilder ant = new AntBuilder()
ant.move(file: "C:/Program Files/Apache Software Foundation/Tomcat 5.5/conf/server2.xml" , tofile: "C:/Program Files/Apache Software Foundation/Tomcat 5.5/conf/server.xml" );
catch ( Exception e )
//Catch exception if any
println( "Error: " + e.getMessage() );
我尝试过的两种方法都不会得到预期的结果。知道如何实现这一目标吗?
【问题讨论】:
【参考方案1】:findAll
不应该是:
root.'**'.findAll it.name() == 'Resource' && it.@name == 'jdbc/testDS'
所以为了让你的第一个 sn-p 更“时髦”,你最终会得到:
new XmlParser().with parser ->
def root = parser.parse( 'C:/Program Files/Apache Software Foundation/Tomcat 5.5/conf/server.xml' )
String frag = '''<Resource name="jdbc/testDS"
| auth="Container"
| type="javax.sql.DataSource"
| driverClassName="oracle.jdbc.OracleDriver"
| url="jdbc:oracle:thin:@localhost:1521:ORA"
| username="ORA_TEST"
| password="*****"
| factory="org.apache.commons.dbcp.BasicDataSourceFactory"
| defaultAutoCommit="false"
| maxActive="10"
| maxIdle="5"
| maxWait="30000"
| whenExhaustedAction="1"
| driver="oracle.jdbc.OracleDriver"/>'''.stripMargin()
def fragment = parser.parseText( frag );
if( !root.'**'.Resource.@name.find it == 'jdbc/testDS' )
root.find it.name() == 'GlobalNamingResources' .children() << fragment
String outxml = groovy.xml.XmlUtil.serialize( root )
println outxml
【讨论】:
谢谢蒂姆,这确实有效。但是如何在 server.xml 中写回新条目,上面的代码用于显示插入的条目。该方法是否应该将 server.xml 的内容替换为 outxml 变量的内容。或者在 server.xml 中插入一行条目。以上是关于如果条目丢失,则使用 groovy 查找并添加内部级别子节点的主要内容,如果未能解决你的问题,请参考以下文章
在 Spark 结构化流中将数据内部连接到左连接 DataFrame 时丢失条目
使用 DropDownOpened 刷新 ComboBox 导致丢失选中