001.
<?php
002.
$text_xml_file
=
'test-domxml.xml'
;
003.
$act
= (isset(
$_REQUEST
[
'act'
]) ? trim(
$_REQUEST
[
'act'
]) :
''
);
004.
005.
006.
007.
detectFileAndCreate();
008.
009.
if
(
$act
==
'write'
) {
010.
writeXmlData();
011.
}
elseif
(
$act
==
'delete'
) {
012.
deleteXmlDataOrFile();
013.
}
014.
015.
016.
017.
018.
019.
020.
021.
function
deleteXmlDataOrFile()
022.
{
023.
global
$text_xml_file
;
024.
025.
$ids
= (isset(
$_REQUEST
[
'id'
]) ?
$_REQUEST
[
'id'
] : []);
026.
$delete
= (isset(
$_REQUEST
[
'delete'
]) ? trim(
$_REQUEST
[
'delete'
]) :
''
);
027.
028.
if
(
$delete
===
'all'
) {
029.
unset(
$delete
,
$ids
);
030.
031.
if
(
is_file
(
$text_xml_file
) &&
is_writable
(
$text_xml_file
)) {
032.
unlink(
$text_xml_file
);
033.
detectFileAndCreate();
034.
return
true;
035.
}
036.
return
false;
037.
}
elseif
(
$delete
===
'selected'
) {
038.
unset(
$delete
);
039.
040.
if
(!
empty
(
$ids
)) {
041.
$dom
=
new
\DOMDocument(
'1.0'
,
'UTF-8'
);
042.
$dom
->validateOnParse = true;
043.
$dom
->preserveWhiteSpace = false;
044.
$dom
->formatOutput = true;
045.
$dom
->load(
$text_xml_file
);
046.
047.
if
(
is_array
(
$ids
)) {
048.
$delete_count
= 0;
049.
foreach
(
$ids
as
$id
) {
050.
$repo_list
=
$dom
->getElementsByTagName(
'list'
);
051.
foreach
(
$repo_list
as
$repository
) {
052.
$items
=
$repository
->getElementsByTagName(
'item'
);
053.
if
(
$items
!= null) {
054.
foreach
(
$items
as
$item
) {
055.
if
(
$item
->getAttribute(
'id'
) ==
$id
) {
056.
$item
->parentNode->removeChild(
$item
);
057.
$delete_count
++;
058.
}
059.
}
060.
unset(
$item
);
061.
}
062.
unset(
$items
);
063.
}
064.
}
065.
unset(
$id
);
066.
067.
if
(
$delete_count
> 0) {
068.
$dom
->save(
$text_xml_file
, LIBXML_NOEMPTYTAG);
069.
unset(
$delete_count
,
$dom
,
$ids
);
070.
return
true;
071.
}
072.
unset(
$delete_count
);
073.
}
074.
}
075.
}
076.
077.
unset(
$delete
,
$dom
,
$ids
);
078.
return
false;
079.
}
080.
081.
082.
083.
084.
085.
function
detectFileAndCreate()
086.
{
087.
global
$text_xml_file
;
088.
089.
if
(!
file_exists
(
$text_xml_file
)) {
090.
$dom
=
new
\DOMDocument(
'1.0'
,
'UTF-8'
);
091.
$dom
->preserveWhiteSpace = false;
092.
$dom
->formatOutput = true;
093.
094.
$root
=
$dom
->createElement(
'root'
);
095.
$root
=
$dom
->appendChild(
$root
);
096.
097.
098.
$plugins
=
$dom
->createElement(
'plugins'
);
099.
$plugins
=
$root
->appendChild(
$plugins
);
100.
101.
$title
=
$dom
->createElement(
'title'
);
102.
$title
=
$plugins
->appendChild(
$title
);
103.
104.
$title_text
=
$dom
->createTextNode(
'Plugins list'
);
105.
$title_text
=
$title
->appendChild(
$title_text
);
106.
107.
$list
=
$dom
->createElement(
'list'
);
108.
$list
=
$plugins
->appendChild(
$list
);
109.
110.
111.
$themes
=
$dom
->createElement(
'themes'
);
112.
$themes
=
$root
->appendChild(
$themes
);
113.
114.
$title
=
$dom
->createElement(
'title'
);
115.
$title
=
$themes
->appendChild(
$title
);
116.
117.
$title_text
=
$dom
->createTextNode(
'Themes list'
);
118.
$title_text
=
$title
->appendChild(
$title_text
);
119.
120.
$list
=
$dom
->createElement(
'list'
);
121.
$list
=
$themes
->appendChild(
$list
);
122.
123.
$dom
->save(
$text_xml_file
, LIBXML_NOEMPTYTAG);
124.
unset(
$dom
,
$list
,
$plugins
,
$root
,
$themes
,
$title
,
$title_text
);
125.
}
126.
127.
if
(
file_exists
(
$text_xml_file
) && !
is_file
(
$text_xml_file
)) {
128.
throw
new
\Exception(
'The file "'
.
$text_xml_file
.
'" is not a file, please delete it manually at '
.
realpath
(
$text_xml_file
) .
'.'
);
129.
}
130.
}
131.
132.
133.
134.
135.
136.
137.
138.
function
displayXmlData(
$section
)
139.
{
140.
global
$text_xml_file
;
141.
142.
if
(
$section
!=
'plugins'
&&
$section
!=
'themes'
) {
143.
$section
=
'plugins'
;
144.
}
145.
146.
$dom
=
new
\DOMDocument(
'1.0'
,
'UTF-8'
);
147.
$dom
->preserveWhiteSpace = false;
148.
$dom
->formatOutput = true;
149.
$dom
->load(
$text_xml_file
);
150.
151.
$repo_list
=
$dom
152.
->getElementsByTagName(
$section
)->item(0)
153.
->getElementsByTagName(
'list'
);
154.
155.
if
(!
empty
(
$repo_list
)) {
156.
foreach
(
$repo_list
as
$repository
) {
157.
$items
=
$repository
->getElementsByTagName(
'item'
);
158.
if
(
$items
!= null) {
159.
foreach
(
$items
as
$item
) {
160.
$name
=
$item
->getElementsByTagName(
'name'
)->item(0);
161.
$version
=
$item
->getElementsByTagName(
'version'
)->item(0);
162.
echo
'<label>'
.
"\n"
;
163.
echo
' <input type="checkbox" name="id[]" value="'
.
$item
->getAttribute(
'id'
) .
'"> '
;
164.
echo
'ID '
.
$item
->getAttribute(
'id'
) .
': '
.
$name
->nodeValue .
' '
.
$version
->nodeValue .
"\n"
;
165.
echo
'</label><br>'
.
"\n"
;
166.
unset(
$name
,
$version
);
167.
}
168.
unset(
$item
);
169.
}
170.
unset(
$items
);
171.
}
172.
unset(
$repository
);
173.
}
174.
175.
unset(
$dom
,
$repo_list
);
176.
}
177.
178.
179.
180.
181.
182.
function
writeXmlData()
183.
{
184.
global
$text_xml_file
;
185.
186.
$section
= (isset(
$_REQUEST
[
'section'
]) ? trim(
$_REQUEST
[
'section'
]) :
'plugins'
);
187.
$id
= (isset(
$_REQUEST
[
'id'
]) ? trim(
$_REQUEST
[
'id'
]) :
''
);
188.
$name
= (isset(
$_REQUEST
[
'name'
]) ? trim(
$_REQUEST
[
'name'
]) :
''
);
189.
$version
= (isset(
$_REQUEST
[
'version'
]) ? trim(
$_REQUEST
[
'version'
]) :
''
);
190.
191.
if
(
$section
!= null &&
$name
!= null &&
$version
!= null &&
$id
!= null &&
is_numeric
(
$id
)) {
192.
$dom
=
new
\DOMDocument(
'1.0'
,
'UTF-8'
);
193.
$dom
->preserveWhiteSpace = false;
194.
$dom
->formatOutput = true;
195.
$dom
->load(
$text_xml_file
);
196.
197.
$repo_list
=
$dom
198.
->getElementsByTagName(
$section
)->item(0)
199.
->getElementsByTagName(
'list'
)->item(0);
200.
201.
$repository
=
$dom
->createElement(
'item'
);
202.
203.
$repository_attribute
=
$dom
->createAttribute(
'id'
);
204.
$repository_attribute
->value =
$id
;
205.
$repository
->appendChild(
$repository_attribute
);
206.
207.
$name_element
=
$dom
->createElement(
'name'
);
208.
$name_element
=
$repository
->appendChild(
$name_element
);
209.
210.
$name_text
=
$dom
->createTextNode(
$name
);
211.
$name_text
=
$name_element
->appendChild(
$name_text
);
212.
213.
$version_element
=
$dom
->createElement(
'version'
);
214.
$version_element
=
$repository
->appendChild(
$version_element
);
215.
216.
$version_text
=
$dom
->createTextNode(
$version
);
217.
$version_text
=
$version_element
->appendChild(
$version_text
);
218.
219.
$repo_list
->appendChild(
$repository
);
220.
$dom
->save(
$text_xml_file
, LIBXML_NOEMPTYTAG);
221.
}
222.
223.
unset(
$dom
,
$name
,
$name_element
,
$name_text
,
$repo_list
,
$repository
,
$section
,
$version
,
$version_element
,
$version_text
);
224.
}
225.
226.
227.
?>
228.
<!DOCTYPE html>
229.
<html>
230.
<head>
231.
<meta charset=
"utf-8"
>
232.
<title>Test DOM XML</title>
233.
<style type=
"text/css"
>
234.
h1, h2, h3, h4, h5, h6, p {
235.
margin: 0 0 10px 0;
236.
padding: 0;
237.
}
238.
hr {
239.
border: none;
240.
border-top: 1px solid #ccc;
241.
}
242.
pre {
243.
background-color: #333;
244.
color: #ddd;
245.
margin: 0 0 10px;
246.
overflow: hidden;
247.
overflow-wrap:
break
-word;
248.
overflow-y: auto;
249.
padding: 10px;
250.
white-space: pre-wrap;
251.
word-
break
:
break
-all;
252.
word-wrap:
break
-word;
253.
}
254.
.form-result-placeholder {
255.
display: none;
256.
margin: 0 0 20px;
257.
}
258.
.container::after {
259.
clear: both;
260.
content:
''
;
261.
display: table;
262.
}
263.
.container {
264.
margin: 0 auto;
265.
width: 1000px;
266.
}
267.
.xml-read {
268.
float: left;
269.
margin: 0 10px 0 0;
270.
width: 490px;
271.
}
272.
.xml-write-
delete
{
273.
float: left;
274.
margin: 0 0 0 10px;
275.
width: 490px;
276.
}
277.
</style>
278.
</head>
279.
<body>
280.
<div
class
=
"form-result-placeholder"
>
281.
282.
</div><!--.form-result-placeholder-->
283.
<div
class
=
"container"
>
284.
<h1>Test read/write XML using DOM</h1>
285.
<div
class
=
"xml-read"
>
286.
<h2>XML content</h2>
287.
<pre><?php
echo
htmlspecialchars(
file_get_contents
(
$text_xml_file
), ENT_QUOTES); ?></pre>
288.
</div><!--.xml-read-->
289.
<div
class
=
"xml-write-delete"
>
290.
<h3>Write</h3>
291.
<form method=
"post"
>
292.
<input type=
"hidden"
name=
"act"
value=
"write"
>
293.
Section:
294.
<select name=
"section"
>
295.
<option value=
"plugins"
>Plugins</option>
296.
<option value=
"themes"
>Themes</option>
297.
</select><br>
298.
ID:
299.
<input type=
"number"
name=
"id"
autocomplete=
"off"
><br>
300.
Name:
301.
<input type=
"text"
name=
"name"
autocomplete=
"off"
><br>
302.
Version:
303.
<input type=
"text"
name=
"version"
autocomplete=
"off"
><br>
304.
<button type=
"submit"
>Submit</button>
305.
</form>
306.
<hr>
307.
<h3>
Delete
</h3>
308.
<form method=
"post"
>
309.
<input type=
"hidden"
name=
"act"
value=
"delete"
>
310.
<h4>Plugins</h4>
311.
<?php displayXmlData(
'plugins'
); ?>
312.
<h4>Themes</h4>
313.
<?php displayXmlData(
'themes'
); ?>
314.
<button type=
"submit"
name=
"delete"
value=
"selected"
>
Delete
selected</button>
315.
<button type=
"submit"
name=
"delete"
value=
"all"
>
Delete
all (
delete
XML file)</button>
316.
</form>
317.
</div><!--.xml-write-
delete
-->
318.
</div><!--.container-->
319.
</body>
320.
</html>