Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / StAX как изменить значение аттрибута / 9 сообщений из 9, страница 1 из 1
02.08.2013, 19:48:05
    #38353548
mvn3
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
StAX как изменить значение аттрибута
Добрый день всем.

Мне нужно работать с большими 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
02.08.2013, 20:43:55
    #38353576
iMove
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
StAX как изменить значение аттрибута
mvn3,
StAX это стриминговое апи, оно подразумевает только чтение. Считайте это аналогом InputStream.
...
Рейтинг: 0 / 0
02.08.2013, 22:35:06
    #38353638
Partisan M
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
StAX как изменить значение аттрибута
iMoveStAX это стриминговое апи, оно подразумевает только чтение. Считайте это аналогом InputStream.

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

Короче говоря, надо четко понимать разницу между DOM и SAX/StAX. В первом случае вы создаете в памяти модель всего докмента. Потом с этой моделью что-то делаете - добавляете ноды, меняете аттрибуты, и т.д. А потом эту модель сериалзуете обратно в XML.
В SAX/StAX вы работаете с потоками. При чтении вам идет поток ивентов, и вы сами решаете, во что эти ивенты превратить. При записи все наоборот - вы руками отдаете движку поток ивентов, а он их превращает в XML.
...
Рейтинг: 0 / 0
02.08.2013, 23:19:21
    #38353659
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
StAX как изменить значение аттрибута
mvn3, а какого размера у тебя документы? (Мегабайты? Сотни мегебайт? )
...
Рейтинг: 0 / 0
03.08.2013, 23:54:46
    #38354108
imperfekt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
StAX как изменить значение аттрибута
Как-то так, например. Пример подогнан под ваш 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
04.08.2013, 00:53:49
    #38354124
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
StAX как изменить значение аттрибута
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
04.08.2013, 01:07:31
    #38354126
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
StAX как изменить значение аттрибута
Или AutoCloseable или .close().

А гори оно пламенем. Автору это всё равно не пригодиться.
...
Рейтинг: 0 / 0
04.08.2013, 06:04:26
    #38354147
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
StAX как изменить значение аттрибута
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
Форумы / Java [игнор отключен] [закрыт для гостей] / StAX как изменить значение аттрибута / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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