Skip to content

Instantly share code, notes, and snippets.

@sunmeat
Created November 7, 2025 11:34
Show Gist options
  • Select an option

  • Save sunmeat/d87aedb418bac92b031cd22096b4243b to your computer and use it in GitHub Desktop.

Select an option

Save sunmeat/d87aedb418bac92b031cd22096b4243b to your computer and use it in GitHub Desktop.
xml files android example
package site.sunmeat.xml;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import java.io.*;
import java.util.*;
import javax.xml.parsers.*;
public class MainActivity extends AppCompatActivity {
private static final String LOG_TAG = "xml_results";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// створюємо оригінальний xml файл програмно
createOriginalXmlFile();
// розбираємо xml з файлу (читання та логування оригінального вмісту)
parseAndLogOriginalXml();
// модифікуємо xml та зберігаємо у внутрішнє сховище
modifyAndSaveXml();
// створюємо новий xml з нуля та зберігаємо у внутрішнє сховище
createAndSaveNewXml();
Toast.makeText(this, "всі операції з xml завершено! перевірте logcat.", Toast.LENGTH_LONG).show();
}
private void createOriginalXmlFile() {
try {
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
// створюємо новий документ для оригінального xml
Document doc = docBuilder.newDocument();
// кореневий елемент company
Element rootElement = doc.createElement("company");
doc.appendChild(rootElement);
// staff елемент 1
Element staff1 = doc.createElement("staff");
Attr attr1 = doc.createAttribute("id");
attr1.setValue("1");
staff1.setAttributeNode(attr1);
rootElement.appendChild(staff1);
Element firstname1 = doc.createElement("firstname");
firstname1.appendChild(doc.createTextNode("Тарас"));
staff1.appendChild(firstname1);
Element lastname1 = doc.createElement("lastname");
lastname1.appendChild(doc.createTextNode("Шевченко"));
staff1.appendChild(lastname1);
Element nickname1 = doc.createElement("nickname");
nickname1.appendChild(doc.createTextNode("Кобзар"));
staff1.appendChild(nickname1);
Element salary1 = doc.createElement("salary");
salary1.appendChild(doc.createTextNode("10000"));
staff1.appendChild(salary1);
// staff елемент 2
Element staff2 = doc.createElement("staff");
Attr attr2 = doc.createAttribute("id");
attr2.setValue("2");
staff2.setAttributeNode(attr2);
rootElement.appendChild(staff2);
Element firstname2 = doc.createElement("firstname");
firstname2.appendChild(doc.createTextNode("Леся"));
staff2.appendChild(firstname2);
Element lastname2 = doc.createElement("lastname");
lastname2.appendChild(doc.createTextNode("Українка"));
staff2.appendChild(lastname2);
Element nickname2 = doc.createElement("nickname");
nickname2.appendChild(doc.createTextNode("Зеїсок"));
staff2.appendChild(nickname2);
Element salary2 = doc.createElement("salary");
salary2.appendChild(doc.createTextNode("20000"));
staff2.appendChild(salary2);
// зберігаємо оригінальний xml у внутрішнє сховище
var originalFile = new File(getFilesDir(), "original.xml");
String xmlContent = serializeDocument(doc);
try (FileWriter writer = new FileWriter(originalFile)) {
writer.write(xmlContent);
}
Log.i(LOG_TAG, "оригінальний xml створено та збережено у: " + originalFile.getAbsolutePath());
} catch (ParserConfigurationException | IOException | DOMException e) {
Log.e(LOG_TAG, "помилка при створенні оригінального xml!", e);
}
}
private void parseAndLogOriginalXml() {
try (InputStream file = new FileInputStream(new File(getFilesDir(), "original.xml"))) {
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(file);
doc.getDocumentElement().normalize();
Log.i(LOG_TAG, "кореневий елемент: " + doc.getDocumentElement().getNodeName());
NodeList nList = doc.getElementsByTagName("staff");
Log.i(LOG_TAG, "----------------------------");
for (int temp = 0; temp < nList.getLength(); temp++) {
Node nNode = nList.item(temp);
Log.i(LOG_TAG, "\nпоточний елемент: " + nNode.getNodeName());
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
Log.i(LOG_TAG, "id персоналу: " + eElement.getAttribute("id"));
Log.i(LOG_TAG, "ім'я: " + eElement.getElementsByTagName("firstname").item(0).getTextContent());
Log.i(LOG_TAG, "прізвище: " + eElement.getElementsByTagName("lastname").item(0).getTextContent());
Log.i(LOG_TAG, "псевдонім: " + eElement.getElementsByTagName("nickname").item(0).getTextContent());
Log.i(LOG_TAG, "зарплата: " + eElement.getElementsByTagName("salary").item(0).getTextContent() + "\n");
}
}
Log.i(LOG_TAG, "оригінальний xml успішно розібрано!");
} catch (ParserConfigurationException | SAXException | IOException | DOMException e) {
Log.e(LOG_TAG, "помилка при розборі оригінального xml!", e);
}
}
private void modifyAndSaveXml() {
try (InputStream file = new FileInputStream(new File(getFilesDir(), "original.xml"))) {
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.parse(file);
// отримуємо кореневий елемент
Node company = doc.getFirstChild();
// отримуємо елемент staff за тегом
Node staff = doc.getElementsByTagName("staff").item(0);
// оновлюємо атрибут id
NamedNodeMap attr = staff.getAttributes();
Node nodeAttr = attr.getNamedItem("id");
nodeAttr.setTextContent("2");
// додаємо новий елемент age
Element age = doc.createElement("age");
age.appendChild(doc.createTextNode("29"));
staff.appendChild(age);
// перебираємо дочірні елементи staff та збираємо для видалення
NodeList list = staff.getChildNodes();
List<Node> toRemove = new ArrayList<>();
for (int i = 0; i < list.getLength(); i++) {
Node node = list.item(i);
// оновлюємо значення salary
if ("salary".equals(node.getNodeName())) {
node.setTextContent("1000000");
}
// збираємо firstname для видалення
if ("firstname".equals(node.getNodeName())) {
toRemove.add(node);
}
}
// видаляємо зібрані елементи
for (Node node : toRemove)
staff.removeChild(node);
// зберігаємо модифікований xml у внутрішнє сховище без DOMSource
var internalFile = new File(getFilesDir(), "modified.xml");
String xmlContent = serializeDocument(doc);
try (FileWriter writer = new FileWriter(internalFile)) {
writer.write(xmlContent);
}
Log.i(LOG_TAG, "модифікований xml збережено у: " + internalFile.getAbsolutePath());
} catch (ParserConfigurationException | IOException | SAXException | DOMException e) {
Log.e(LOG_TAG, "помилка при модифікації та збереженні xml!", e);
}
}
private void createAndSaveNewXml() {
try {
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
// створюємо новий документ
Document doc = docBuilder.newDocument();
// кореневий елемент company
Element rootElement = doc.createElement("company");
doc.appendChild(rootElement);
// елемент staff
Element staff = doc.createElement("staff");
rootElement.appendChild(staff);
// атрибут id
Attr attr = doc.createAttribute("id");
attr.setValue("1");
staff.setAttributeNode(attr);
// firstname
Element firstname = doc.createElement("firstname");
firstname.appendChild(doc.createTextNode("Григорій"));
staff.appendChild(firstname);
// lastname
Element lastname = doc.createElement("lastname");
lastname.appendChild(doc.createTextNode("Сковорода"));
staff.appendChild(lastname);
// nickname
Element nickname = doc.createElement("nickname");
nickname.appendChild(doc.createTextNode("Пательня"));
staff.appendChild(nickname);
// salary
Element salary = doc.createElement("salary");
salary.appendChild(doc.createTextNode("100500"));
staff.appendChild(salary);
// зберігаємо новий xml у внутрішнє сховище без DOMSource
var internalFile = new File(getFilesDir(), "new.xml");
String xmlContent = serializeDocument(doc);
try (FileWriter writer = new FileWriter(internalFile)) {
writer.write(xmlContent);
}
Log.i(LOG_TAG, "новий xml створено та збережено у: " + internalFile.getAbsolutePath());
} catch (ParserConfigurationException | IOException | DOMException e) {
Log.e(LOG_TAG, "помилка при створенні нового xml!", e);
}
}
// допоміжний метод для серіалізації Document у String без використання DOMSource
private String serializeDocument(Document doc) {
StringWriter sw = new StringWriter();
sw.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
try {
serializeNode(doc.getDocumentElement(), sw, 0, doc);
return sw.toString();
} catch (IOException e) {
Log.e(LOG_TAG, "помилка серіалізації xml!", e);
return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<error/>";
}
}
// рекурсивний метод для серіалізації вузлів з відступами
private void serializeNode(Node node, StringWriter sw, int indent, Document doc) throws IOException {
String indentStr = " ".repeat(Math.max(0, indent));
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
sw.append(indentStr);
sw.append("<").append(element.getTagName());
// додаємо атрибути
NamedNodeMap attributes = element.getAttributes();
for (int i = 0; i < attributes.getLength(); i++) {
Attr attribute = (Attr) attributes.item(i);
sw.append(" ").append(attribute.getName()).append("=\"").append(escapeXml(attribute.getValue())).append("\"");
}
sw.append(">");
NodeList children = element.getChildNodes();
boolean hasChildren = false;
boolean hasText = false;
for (int i = 0; i < children.getLength(); i++) {
Node child = children.item(i);
if (child.getNodeType() == Node.ELEMENT_NODE) {
hasChildren = true;
sw.append("\n");
serializeNode(child, sw, indent + 1, doc);
} else if (child.getNodeType() == Node.TEXT_NODE && !child.getTextContent().trim().isEmpty()) {
hasText = true;
sw.append(escapeXml(child.getTextContent().trim()));
}
}
if (hasChildren) {
sw.append("\n").append(indentStr);
}
sw.append("</").append(element.getTagName()).append(">\n");
}
}
// екранування спеціальних символів XML
private String escapeXml(String text) {
if (text == null) return "";
return text.replace("&", "&amp;")
.replace("<", "&lt;")
.replace(">", "&gt;")
.replace("\"", "&quot;")
.replace("'", "&apos;");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment