powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / StAX как изменить значение аттрибута
9 сообщений из 9, страница 1 из 1
StAX как изменить значение аттрибута
    #38353548
mvn3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день всем.

Мне нужно работать с большими XML документами + модифицировать некоторые атрибуты в существующей структуре.
Для быстрого чтения использую StAX + woodstox. Читает без проблем, но не могу понять а как модифицировать значения атрибутов? Т.е. например если значение атрибута prm2 = "Data2" тогда присвоить ему значение например "Data123".

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
<?xml version="1.0" encoding="UTF-8"?>  
<config>  
    <item 
    	prm1="Data1" 
    	prm2="Data2"
    	prm3="Data3"
    >           
</config>  



Мне нужен след функционал:
1) Удалить полностью все строку с атрибутами,
2) Добавить атрибут
3) Модифицировать существующий аттрубут.
4) Модифицировать значение сущ. аттрибута
Это вообще возможно в StAX-e?

Из примеров которые я нагуглил, я видел только возможность создать элемент с нуля, т.е.

Код: java
1.
2.
3.
4.
xmlStreamWriter.writeStartElement("node");
xmlStreamWriter.writeAttribute("attribute0","value0");
xmlStreamWriter.writeAttribute("attribute1","value1");
xmlStreamWriter.writeEndElement();
...
Рейтинг: 0 / 0
StAX как изменить значение аттрибута
    #38353576
iMove
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mvn3,
StAX это стриминговое апи, оно подразумевает только чтение. Считайте это аналогом InputStream.
...
Рейтинг: 0 / 0
StAX как изменить значение аттрибута
    #38353638
Partisan M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iMoveStAX это стриминговое апи, оно подразумевает только чтение. Считайте это аналогом InputStream.

А по-русски нельзя было повыражаться? Впрочем, мнение неправильное и ниоткуда не следующее. Ознакомьтесь с каким-нибудь описанием StAX.
...
Рейтинг: 0 / 0
StAX как изменить значение аттрибута
    #38353650
iMove
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, писал с телефона, экономил слова и переключения языка, и получилось непонятно

Короче говоря, надо четко понимать разницу между DOM и SAX/StAX. В первом случае вы создаете в памяти модель всего докмента. Потом с этой моделью что-то делаете - добавляете ноды, меняете аттрибуты, и т.д. А потом эту модель сериалзуете обратно в XML.
В SAX/StAX вы работаете с потоками. При чтении вам идет поток ивентов, и вы сами решаете, во что эти ивенты превратить. При записи все наоборот - вы руками отдаете движку поток ивентов, а он их превращает в XML.
...
Рейтинг: 0 / 0
StAX как изменить значение аттрибута
    #38353659
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mvn3, а какого размера у тебя документы? (Мегабайты? Сотни мегебайт? )
...
Рейтинг: 0 / 0
StAX как изменить значение аттрибута
    #38354108
imperfekt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как-то так, например. Пример подогнан под ваш XML, но нюансов очень много.


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
import java.io.ByteArrayOutputStream;
import java.io.StringReader;
import java.util.Iterator;
import javax.xml.stream.XMLEventFactory;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLEventWriter;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.XMLEvent;

public class StaxTest {

    private XMLEventFactory eventFactory = XMLEventFactory.newInstance();
    private XMLInputFactory inputFactory = XMLInputFactory.newInstance();
    private XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
    private String content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>  \n"
            + "<config>  \n"
            + "    <item \n"
            + "    	prm1=\"Data1\" \n"
            + "    	prm2=\"Data2\"\n"
            + "    	prm3=\"Data3\"\n"
            + "    />           \n"
            + "</config> ";

    public void removeElement() {
        ByteArrayOutputStream baos = null;
        XMLEventReader reader = null;
        XMLEventWriter writer = null;
        try {
            baos = new ByteArrayOutputStream();
            reader = inputFactory.createXMLEventReader(new StringReader(content));
            writer = outputFactory.createXMLEventWriter(baos);
            while (reader.hasNext()) {
                XMLEvent event = reader.nextEvent();
                if (event.isStartElement()
                        && event.asStartElement().getName().getLocalPart().equals("item")) {
                    continue;
                }
                if (event.isEndElement()
                        && event.asEndElement().getName().getLocalPart().equals("item")) {
                    continue;
                }
                writer.add(event);
            }
            writer.flush();
            System.out.println(baos.toString());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (baos != null) {
                    baos.close();
                }
                if (reader != null) {
                    reader.close();
                }
                if (writer != null) {
                    writer.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public void addAttribute() {
        ByteArrayOutputStream baos = null;
        XMLEventReader reader = null;
        XMLEventWriter writer = null;
        try {
            baos = new ByteArrayOutputStream();
            reader = inputFactory.createXMLEventReader(new StringReader(content));
            writer = outputFactory.createXMLEventWriter(baos);
            while (reader.hasNext()) {
                XMLEvent event = reader.nextEvent();
                if (event.isStartElement()
                        && event.asStartElement().getName().getLocalPart().equals("item")) {
                    writer.add(event);
                    XMLEvent attribute = eventFactory.createAttribute("new_attribute", "value");
                    writer.add(attribute);
                    continue;
                }
                writer.add(event);
            }
            writer.flush();
            System.out.println(baos.toString());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (baos != null) {
                    baos.close();
                }
                if (reader != null) {
                    reader.close();
                }
                if (writer != null) {
                    writer.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public void changeAttribute() {
        ByteArrayOutputStream baos = null;
        XMLEventReader reader = null;
        XMLEventWriter writer = null;
        try {
            baos = new ByteArrayOutputStream();
            reader = inputFactory.createXMLEventReader(new StringReader(content));
            writer = outputFactory.createXMLEventWriter(baos);
            while (reader.hasNext()) {
                XMLEvent event = reader.nextEvent();
                if (event.isStartElement()
                        && event.asStartElement().getName().getLocalPart().equals("item")) {
                    XMLEvent newEvent = eventFactory.createStartElement(event.asStartElement().getName(), null, event.asStartElement().getNamespaces());
                    Iterator<Attribute> iterator = event.asStartElement().getAttributes();
                    writer.add(newEvent);
                    while (iterator.hasNext()) {
                        Attribute attribute = iterator.next();
                        XMLEvent attributeEvent;
                        if (!attribute.getName().getLocalPart().equals("prm1")) {
                            attributeEvent = eventFactory.createAttribute(attribute.getName(), attribute.getValue());
                        } else {
                            attributeEvent = eventFactory.createAttribute("new_attribute_name", "new_attribute_value");
                        }
                        writer.add(attributeEvent);
                    }
                    continue;
                }
                writer.add(event);
            }
            writer.flush();
            System.out.println(baos.toString());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (baos != null) {
                    baos.close();
                }
                if (reader != null) {
                    reader.close();
                }
                if (writer != null) {
                    writer.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) throws XMLStreamException {
        StaxTest st = new StaxTest();
        st.removeElement();
        st.addAttribute();
        st.changeAttribute();
    }
}


...
Рейтинг: 0 / 0
StAX как изменить значение аттрибута
    #38354124
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Some refactorings here...

Щёрт... без кучи говно кода не поддержишь AutoCloseable...

Код: xml
1.
2.
3.
4.
5.
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>0.12.0</version>
        </dependency>



Иногда java-вское ООП стоит поперёк горла как стухшая сосиска. Дайте хардкорный
инструментейшн чтоб не плодить сущности...
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public class XMLEventWriterCloseable implements XMLEventWriter,AutoCloseable {

    XMLEventWriter w;

    public XMLEventWriterCloseable(XMLEventWriter w) {
        this.w = w;
    }

    @Override
    public void close() throws XMLStreamException {
        w.close();
    }

    ....... // add your implementation here, codemonk.
}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
    public void removeElement(String nameElement) throws XMLStreamException{ // здесь спорно... Exception на моей советсти но без него идея фейлится
        @Cleanup ByteArrayOutputStream baos = new ByteArrayOutputStream(); // автоочистка. 
        @Cleanup XMLEventReaderCloseable reader = new XMLEventReaderCloseable(inputFactory.createXMLEventReader(new StringReader(content)));;
        @Cleanup XMLEventWriterCloseable writer = new XMLEventWriterCloseable(outputFactory.createXMLEventWriter(baos));
        while (reader.hasNext()) {
            XMLEvent event = reader.nextEvent();
            if (event.isStartElement()
                    && event.asStartElement().getName().getLocalPart().equals(nameElement)) {
                continue;
            } else if (event.isEndElement() // старт и end одновременно не приходят
                    && event.asEndElement().getName().getLocalPart().equals(nameElement)) {
                continue;
            }
            writer.add(event);
        }
        writer.flush();
        log.info(baos.toString());
    }



Щастливые обладатели JDK7 пробуют try-with-resources...

Blazkowicz, помогай мыслями... Я выдохся.
...
Рейтинг: 0 / 0
StAX как изменить значение аттрибута
    #38354126
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или AutoCloseable или .close().

А гори оно пламенем. Автору это всё равно не пригодиться.
...
Рейтинг: 0 / 0
StAX как изменить значение аттрибута
    #38354147
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mvn3,

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
import java.io.StringReader;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventFactory;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLEventWriter;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;

...
XMLEventReader xmler = XMLInputFactory.newInstance().createXMLEventReader(
    new StringReader("<?xml version=\"1.0\" encoding=\"UTF-8\"?><config><item prm1=\"Data1\" prm2=\"Data2\" prm3=\"Data3\"/></config>"));
XMLEventWriter xmlew = XMLOutputFactory.newInstance().createXMLEventWriter(System.out);
while (xmler.hasNext()) {
	XMLEvent event = xmler.nextEvent();
	if (event.isStartElement()) {
		StartElement tag = event.asStartElement();
		QName tagName = tag.getName();
		if (tagName.getLocalPart().equals("item")) {
			XMLEventFactory factory = XMLEventFactory.newInstance();
			Set<Attribute> newAttrs = new HashSet<>();
			Iterator<?> oldAttrs = tag.getAttributes();
			while (oldAttrs.hasNext()) {
				Attribute attr = (Attribute)oldAttrs.next();
				String attrName = attr.getName().getLocalPart(); 
				if (attrName.equals("prm3")) {
					// Исключаем элемент (Удаление)
					continue;
				} 
				if (attrName.equals("prm2")) {
					// Изменение
					attr = factory.createAttribute("prm2", "Data123"); 
				}
				newAttrs.add(attr);
			}
			// Добавление нового
			newAttrs.add(factory.createAttribute("prm3", "Data333"));
			event = factory.createStartElement(tagName, newAttrs.iterator(), null);
		}
	}
	xmlew.add(event);
}
xmler.close();
xmlew.close();
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / StAX как изменить значение аттрибута
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]