mixml 0.9.1 → 0.9.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/README.md +36 -120
- data/bin/mixml +3 -101
- data/demo/application_checks.md +27 -0
- data/demo/application_commands.md +133 -0
- data/demo/application_invocation.md +107 -0
- data/demo/application_output.md +107 -0
- data/demo/application_selection.md +47 -0
- data/demo/application_values.md +167 -0
- data/demo/applique/test.rb +94 -60
- data/lib/mixml/application.rb +162 -0
- data/lib/mixml/document.rb +2 -0
- data/lib/mixml/selection.rb +2 -0
- data/lib/mixml/template/text.rb +2 -0
- data/lib/mixml/tool.rb +20 -19
- data/lib/mixml/version.rb +1 -1
- metadata +12 -20
- data/demo/tool.md +0 -334
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YzAyODY3MmNkMjgyNWM1ZGYzOGNkZTZjNjc3MDAyZjNiYzE0MWUxMA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MjlhOTU2MWZjMDdlYjlkODI3ZDRiZDkwMWUyYjYyOThhMTM2YTNjNQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NTBlYThlYmM1MjVhMzFhZmI3OTRkOGVhMmE5ZTY2ZTM2YzYyOTI5YTA5YWUx
|
10
|
+
MTI4NDU4MDIyYjlkNDY4MTNkNTI3OTQ5YzIwZDZhYWNiMDNlNDgyMzA0ZjVi
|
11
|
+
ZjJmZjI5ODJiMTFlMjlmODcwN2E4YTEyNmEyZGQ1OTE5NDUzMWE=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NDczODMwYzhjNmVjYTYxMTdlZjA5NzhkYzA4YzhmYjg3YjVmZGRmMGZlNWJh
|
14
|
+
N2M5OTI0ZmFhZDQ1MTUzYTUyOGQwMDQ1ZWQ3ZjNmODdjZDFiOTNlZmI5NTFl
|
15
|
+
ZGUxYTc3MTIzNTIxOTExNWNlZmM1MGUxOGFjYmNlN2FhM2QyYWY=
|
data/README.md
CHANGED
@@ -3,9 +3,14 @@
|
|
3
3
|
[![Gem Version](https://badge.fury.io/rb/mixml.png)](http://badge.fury.io/rb/mixml)
|
4
4
|
[![Build Status](https://travis-ci.org/jochenseeber/mixml.png?branch=master)](https://travis-ci.org/jochenseeber/mixml)
|
5
5
|
[![Coverage Status](https://coveralls.io/repos/jochenseeber/mixml/badge.png?branch=master)](https://coveralls.io/r/jochenseeber/mixml?branch=master)
|
6
|
+
[![Inline docs](http://inch-ci.org/github/jochenseeber/mixml.png?branch=master)](http://inch-ci.org/github/jochenseeber/mixml)
|
6
7
|
|
7
|
-
Mixml is a small tool to greatly simplify the tedious task of changing multiple
|
8
|
-
|
8
|
+
Mixml is a small tool to greatly simplify the tedious task of changing multiple XML files at once. Its main purpose is
|
9
|
+
to spare me from having to use XSLT ever again.
|
10
|
+
|
11
|
+
## Usage
|
12
|
+
|
13
|
+
You can use mixml to change XML files in the following ways:
|
9
14
|
|
10
15
|
* Pretty print
|
11
16
|
* Remove nodes
|
@@ -14,151 +19,62 @@ purpose is to spare me from having to use XSLT ever again. You can use mixml to
|
|
14
19
|
* Rename nodes
|
15
20
|
* Change node values
|
16
21
|
|
17
|
-
For example, the following command will remove all attributes named `id` from the
|
22
|
+
For example, the following command will remove all attributes named `id` from the all XML files in the current
|
23
|
+
directory.
|
18
24
|
|
19
25
|
mixml remove --inplace --xpath '//@id' *.xml
|
20
26
|
|
21
|
-
|
22
|
-
following in `test.mixml`:
|
23
|
-
|
24
|
-
xpath '//@id' do
|
25
|
-
remove
|
26
|
-
end
|
27
|
-
|
28
|
-
and then call:
|
29
|
-
|
30
|
-
mixml execute --script test.mixml *.xml
|
31
|
-
|
32
|
-
You can also use mixml directly in your Ruby code:
|
33
|
-
|
34
|
-
require 'mixml'
|
35
|
-
|
36
|
-
tool = Mixml::Tool.new do |t|
|
37
|
-
t.save = true
|
38
|
-
end
|
39
|
-
|
40
|
-
tool.work('one.xml', 'two.xml') do
|
41
|
-
xpath '//@id' do
|
42
|
-
remove
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
Mixml supports building replacement values using
|
47
|
-
|
48
|
-
* [Ruby string interpolation](http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Literals#Interpolation)
|
49
|
-
* [Erubis templates](http://www.kuwata-lab.com/erubis/)
|
50
|
-
* [Nokogiri's XML DSL](http://nokogiri.org/Nokogiri/XML/Builder.html)
|
51
|
-
* Plain Ruby
|
52
|
-
|
53
|
-
You can find more usage examples [here](demo/tool.md).
|
54
|
-
|
55
|
-
## Installation
|
56
|
-
|
57
|
-
Install mixml:
|
58
|
-
|
59
|
-
$ gem install mixml
|
60
|
-
|
61
|
-
## Usage
|
62
|
-
|
63
|
-
Use the following command to get help:
|
27
|
+
The following command will pretty print all XML files:
|
64
28
|
|
65
|
-
mixml --
|
29
|
+
mixml pretty --inplace *.xml
|
66
30
|
|
67
|
-
|
31
|
+
You can find a description of all supported commands and usage examples [here](demo/application_commands.md).
|
68
32
|
|
69
|
-
|
33
|
+
## Selection
|
70
34
|
|
71
|
-
|
35
|
+
In addition to using XPath expressions, you can also use CSS rules to select the nodes you want to process. For
|
36
|
+
example, the following command will remove the first child of each element:
|
72
37
|
|
73
|
-
mixml remove --
|
38
|
+
mixml remove --inplace --css '*:first-child' *.xml
|
74
39
|
|
75
|
-
|
40
|
+
You can find a detailed description and usage examples [here](demo/application_selection.md).
|
76
41
|
|
77
|
-
|
42
|
+
## Scripts
|
78
43
|
|
79
|
-
|
44
|
+
In addition to the command line, mixml also supports a simple simple DSL to perform scripted changes. For example, to
|
45
|
+
perform the same as above using a script, save the following in `test.mixml`:
|
80
46
|
|
81
|
-
|
82
|
-
|
83
|
-
### Append nodes
|
84
|
-
|
85
|
-
mixml append --xpath '/list' --template '<addressbook/>' *.xml
|
86
|
-
|
87
|
-
### Set node value
|
88
|
-
|
89
|
-
mixml value --xpath '//addresses/@name' --template 'default' *.xml
|
90
|
-
|
91
|
-
### Execute a script
|
92
|
-
|
93
|
-
Example script in `test.mixml`
|
94
|
-
|
95
|
-
xpath '//addresses[name="default"]' do
|
47
|
+
xpath '//@id' do
|
96
48
|
remove
|
97
49
|
end
|
98
|
-
xpath '//addresses' do
|
99
|
-
replace template '<addressbook/>'
|
100
|
-
end
|
101
50
|
|
102
|
-
|
51
|
+
and then call:
|
103
52
|
|
104
53
|
mixml execute --script test.mixml *.xml
|
105
54
|
|
106
|
-
|
107
|
-
|
108
|
-
xpath 'xpath-expression' do
|
109
|
-
remove # Remove node
|
110
|
-
replace 'xml' # Replace node
|
111
|
-
append 'xml'
|
112
|
-
value 'text' # Set node value
|
113
|
-
rename 'text' # Rename node
|
114
|
-
end
|
115
|
-
|
116
|
-
Instead of using strings for parameters, you can also use a template expression:
|
117
|
-
|
118
|
-
xpath 'xpath-expression' do
|
119
|
-
replace template 'special-{=node.name}' # Prefix nodes with 'special-''
|
120
|
-
end
|
121
|
-
|
122
|
-
This works for all commands that take a string parameter. We use [Erubis](http://www.kuwata-lab.com/erubis) as
|
123
|
-
templating engine, and `{` and `}` as delimiters.
|
55
|
+
You can also use mixml directly in your Ruby code. See [here](demo/application_invocation.md) for usage examples.
|
124
56
|
|
125
|
-
|
126
|
-
[builder component](http://nokogiri.org/Nokogiri/XML/Builder.html) to create the XML that replaces an element:
|
57
|
+
## Values
|
127
58
|
|
128
|
-
|
129
|
-
replace xml ->(node, xml) {
|
130
|
-
xml.addressbook(:name => node['name'])
|
131
|
-
}
|
132
|
-
end
|
133
|
-
|
134
|
-
### Use CSS rules to select nodes
|
135
|
-
|
136
|
-
You can also use CSS rules instead of XPath expressions to select the nodes to process:
|
137
|
-
|
138
|
-
css 'addresses:first-child', 'addresses:last-child' do
|
139
|
-
remove
|
140
|
-
end
|
141
|
-
|
142
|
-
### Evaluate an expression
|
143
|
-
|
144
|
-
You can also pass the script to execute directly to mixml:
|
59
|
+
Mixml supports specifying XML fragments that are to be inserted using
|
145
60
|
|
146
|
-
|
147
|
-
|
148
|
-
|
61
|
+
* [Ruby string interpolation](http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Literals#Interpolation)
|
62
|
+
* [Erubis templates](http://www.kuwata-lab.com/erubis/)
|
63
|
+
* [Nokogiri's XML DSL](http://nokogiri.org/Nokogiri/XML/Builder.html)
|
64
|
+
* Plain Ruby
|
149
65
|
|
150
|
-
|
151
|
-
files with the changed XML by using the `inplace` option:
|
66
|
+
See [here](demo/application_values.md) for a description of all methods and detailed usage examples.
|
152
67
|
|
153
|
-
|
68
|
+
## Output
|
154
69
|
|
155
|
-
|
70
|
+
XML output can be printed to the console or written back to the file it was read from. Mixml also supports pretty
|
71
|
+
printing all output. See [here](demo/application_output.md) for a detailed description and usage examples.
|
156
72
|
|
157
|
-
|
73
|
+
## Installation
|
158
74
|
|
159
|
-
|
75
|
+
Install mixml:
|
160
76
|
|
161
|
-
|
77
|
+
$ gem install mixml
|
162
78
|
|
163
79
|
## Contributing
|
164
80
|
|
data/bin/mixml
CHANGED
@@ -1,105 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
require 'rubygems'
|
3
3
|
require 'bundler/setup'
|
4
|
-
require '
|
5
|
-
require 'mixml'
|
4
|
+
require 'mixml/application'
|
6
5
|
|
7
|
-
|
8
|
-
|
9
|
-
program :description, 'XML helper tool'
|
10
|
-
|
11
|
-
$tool = Mixml::Tool.new
|
12
|
-
|
13
|
-
global_option('-p', '--pretty', 'Pretty print output') do |value|
|
14
|
-
$tool.pretty = value
|
15
|
-
end
|
16
|
-
|
17
|
-
global_option('-i', '--inplace', 'Replace the processed files with the new files') do |value|
|
18
|
-
$tool.save = value
|
19
|
-
$tool.print = !value
|
20
|
-
end
|
21
|
-
|
22
|
-
command :pretty do |c|
|
23
|
-
c.description = 'Pretty print XML files'
|
24
|
-
c.action do |args, options|
|
25
|
-
$tool.pretty = true
|
26
|
-
$tool.work(args)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
command :remove do |c|
|
31
|
-
c.description = 'Remove nodes from the XML documents'
|
32
|
-
c.option '-x', '--xpath STRING', String, 'XPath for nodes to delete'
|
33
|
-
c.action do |args, options|
|
34
|
-
$tool.work(args) do
|
35
|
-
xpath options.xpath do
|
36
|
-
remove
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
command :replace do |c|
|
43
|
-
c.description = 'Rename nodes in the XML documents'
|
44
|
-
c.option '-x', '--xpath STRING', String, 'XPath for nodes to replace'
|
45
|
-
c.option '-t', '--template STRING', String, 'Template to generate the replacement value'
|
46
|
-
c.action do |args, options|
|
47
|
-
$tool.work(args) do
|
48
|
-
xpath options.xpath do
|
49
|
-
rename template options.template
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
command :append do |c|
|
56
|
-
c.description = 'Append child nodes in the XML documents'
|
57
|
-
c.option '-x', '--xpath STRING', String, 'XPath for nodes to append to'
|
58
|
-
c.option '-t', '--template STRING', String, 'Template to generate the nodes to append'
|
59
|
-
c.action do |args, options|
|
60
|
-
$tool.work(args) do
|
61
|
-
xpath options.xpath do
|
62
|
-
append template options.template
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
command :replace do |c|
|
69
|
-
c.description = 'Replace nodes from the XML documents'
|
70
|
-
c.option '-x', '--xpath STRING', String, 'XPath for nodes to replace'
|
71
|
-
c.option '-t', '--template STRING', String, 'Template to generate the replacement value'
|
72
|
-
c.action do |args, options|
|
73
|
-
$tool.work(args) do
|
74
|
-
xpath options.xpath do
|
75
|
-
replace template options.template
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
command :value do |c|
|
82
|
-
c.description = 'Set node values'
|
83
|
-
c.option '-x', '--xpath STRING', String, 'XPath for nodes to change'
|
84
|
-
c.option '-t', '--template STRING', String, 'Template to generate the replacement value'
|
85
|
-
c.action do |args, options|
|
86
|
-
$tool.work(args) do
|
87
|
-
xpath options.xpath do
|
88
|
-
value template options.template
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
command :execute do |c|
|
95
|
-
c.description = 'Execute script on the XML documents'
|
96
|
-
c.option '-s', '--script STRING', String, 'Script file to execute'
|
97
|
-
c.option '-e', '--expression STRING', String, 'Command to execute'
|
98
|
-
c.action do |args, options|
|
99
|
-
script = options.expression || File.read(options.script)
|
100
|
-
|
101
|
-
$tool.work(args) do
|
102
|
-
execute(script)
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
6
|
+
# Run application if we're the main file
|
7
|
+
Mixml::Application.new.run if $0 == __FILE__
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# Error checking
|
2
|
+
|
3
|
+
The following demonstrations test mixml's error checking. All examples on this page are designed to fail.
|
4
|
+
|
5
|
+
## Command without selector fails
|
6
|
+
|
7
|
+
Executing mixml to modify documents without a selector fails:
|
8
|
+
|
9
|
+
# mixml rename --string 'tiger'
|
10
|
+
|
11
|
+
## Command with multiple values fails
|
12
|
+
|
13
|
+
Executing mixml to modify documents with multiple values fails:
|
14
|
+
|
15
|
+
# mixml rename --xpath '//philosopher' --string 'tiger' --string 'scholar'
|
16
|
+
|
17
|
+
## Command with multiple value types fails
|
18
|
+
|
19
|
+
Executing mixml to modify documents with multiple value types fails:
|
20
|
+
|
21
|
+
# mixml rename --xpath '//philosopher' --string 'tiger' --template 'scholar'
|
22
|
+
|
23
|
+
## Command without selector fails
|
24
|
+
|
25
|
+
Executing mixml to modify documents without a selector fails:
|
26
|
+
|
27
|
+
# mixml rename --string 'tiger'
|
@@ -0,0 +1,133 @@
|
|
1
|
+
# mixml Commands
|
2
|
+
|
3
|
+
This document demonstrates the different mixml commands to modify XML documents.
|
4
|
+
|
5
|
+
## Pretty print
|
6
|
+
|
7
|
+
You can use mixml to pretty print your XML documents.
|
8
|
+
|
9
|
+
Let's use the following XML in file `test.xml`:
|
10
|
+
|
11
|
+
<list><philosopher name="Hobbes"/><philosopher name="Rawls"/></list>
|
12
|
+
|
13
|
+
Now execute the following command to pretty print this file:
|
14
|
+
|
15
|
+
# mixml pretty test.xml
|
16
|
+
|
17
|
+
This produces the following text output:
|
18
|
+
|
19
|
+
<?xml version="1.0"?>
|
20
|
+
<list>
|
21
|
+
<philosopher name="Hobbes"/>
|
22
|
+
<philosopher name="Rawls"/>
|
23
|
+
</list>
|
24
|
+
|
25
|
+
## Remove nodes
|
26
|
+
|
27
|
+
You can use mixml to remove nodes from your XML documents.
|
28
|
+
|
29
|
+
Let's use the following XML in file `test.xml`:
|
30
|
+
|
31
|
+
<list>
|
32
|
+
<philosopher name="Hobbes"/>
|
33
|
+
<philosopher name="Rawls"/>
|
34
|
+
</list>
|
35
|
+
|
36
|
+
Now execute the following command to select some nodes and remove them:
|
37
|
+
|
38
|
+
# mixml remove --xpath '//philosopher[@name="Hobbes"]' test.xml
|
39
|
+
|
40
|
+
This produces the following XML output:
|
41
|
+
|
42
|
+
<list>
|
43
|
+
<philosopher name="Rawls"/>
|
44
|
+
</list>
|
45
|
+
|
46
|
+
## Replace nodes
|
47
|
+
|
48
|
+
You can use mixml to replace nodes in your XML documents.
|
49
|
+
|
50
|
+
Let's use the following XML in file `test.xml`:
|
51
|
+
|
52
|
+
<list>
|
53
|
+
<philosopher name="Hobbes"/>
|
54
|
+
<philosopher name="Rawls"/>
|
55
|
+
</list>
|
56
|
+
|
57
|
+
Now execute the following command to select some nodes and replace them:
|
58
|
+
|
59
|
+
# mixml replace --xpath '//philosopher[@name="Hobbes"]' --string '<tiger name="Hobbes"/>' test.xml
|
60
|
+
|
61
|
+
This produces the following XML output:
|
62
|
+
|
63
|
+
<list>
|
64
|
+
<tiger name="Hobbes"/>
|
65
|
+
<philosopher name="Rawls"/>
|
66
|
+
</list>
|
67
|
+
|
68
|
+
## Append nodes
|
69
|
+
|
70
|
+
You can use mixml to append nodes to your XML documents.
|
71
|
+
|
72
|
+
Let's use the following XML in file `test.xml`:
|
73
|
+
|
74
|
+
<list>
|
75
|
+
<philosopher name="Hobbes"/>
|
76
|
+
<philosopher name="Rawls"/>
|
77
|
+
</list>
|
78
|
+
|
79
|
+
Now execute the following command to select some nodes and append a child node to them:
|
80
|
+
|
81
|
+
# mixml append --xpath '/list' --string '<tiger name="Hobbes"/>' test.xml
|
82
|
+
|
83
|
+
This produces the following XML output:
|
84
|
+
|
85
|
+
<list>
|
86
|
+
<philosopher name="Hobbes"/>
|
87
|
+
<philosopher name="Rawls"/>
|
88
|
+
<tiger name="Hobbes"/>
|
89
|
+
</list>
|
90
|
+
|
91
|
+
## Replace attribute values
|
92
|
+
|
93
|
+
You can use mixml to replace attribute values in your XML documents.
|
94
|
+
|
95
|
+
Let's use the following XML in file `test.xml`:
|
96
|
+
|
97
|
+
<list>
|
98
|
+
<philosopher name="Hobbes"/>
|
99
|
+
<philosopher name="Rawls"/>
|
100
|
+
</list>
|
101
|
+
|
102
|
+
Now execute the following command to select some attributes and change their value:
|
103
|
+
|
104
|
+
# mixml value --xpath '//philosopher[1]/@name' --string 'Platon' test.xml
|
105
|
+
|
106
|
+
This produces the following XML output:
|
107
|
+
|
108
|
+
<list>
|
109
|
+
<philosopher name="Platon"/>
|
110
|
+
<philosopher name="Rawls"/>
|
111
|
+
</list>
|
112
|
+
|
113
|
+
## Rename nodes
|
114
|
+
|
115
|
+
You can use mixml to rename nodes values in your XML documents.
|
116
|
+
|
117
|
+
Let's use the following XML in file `test.xml`:
|
118
|
+
|
119
|
+
<list>
|
120
|
+
<philosopher name="Hobbes"/>
|
121
|
+
<philosopher name="Rawls"/>
|
122
|
+
</list>
|
123
|
+
|
124
|
+
Now execute the following command to select some attributes and rename them:
|
125
|
+
|
126
|
+
# mixml rename --xpath '//philosopher[@name="Hobbes"]' --template 'tiger-and-{=node.name}' test.xml
|
127
|
+
|
128
|
+
This produces the following XML output:
|
129
|
+
|
130
|
+
<list>
|
131
|
+
<tiger-and-philosopher name="Hobbes"/>
|
132
|
+
<philosopher name="Rawls"/>
|
133
|
+
</list>
|