Created
November 7, 2025 11:34
-
-
Save sunmeat/d87aedb418bac92b031cd22096b4243b to your computer and use it in GitHub Desktop.
xml files android example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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("&", "&") | |
| .replace("<", "<") | |
| .replace(">", ">") | |
| .replace("\"", """) | |
| .replace("'", "'"); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment