XMLDOM и String[] data

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
Аватара пользователя
beks000
Сообщения: 75
Зарегистрирован: 26 апр 2013, 18:15
Контактная информация:

XMLDOM и String[] data

Сообщение beks000 » 31 июл 2014, 11:41

У меня возник вопрос по поводу парсинга XML

Например я парсю все firstname из этого списка

[syntax=xml]<?xml version="1.0"?>
<company>
<staff>
<firstname>yong</firstname>
</staff>
<staff>
<firstname>low</firstname>
</staff>
<staff>
<firstname>lower</firstname>
</staff>
<staff>
<firstname>yongmk</firstname>
</staff>
</company>[/syntax]

как мне теперь их "запихнуть" в String[] data ?

хочу попробовать так:

[syntax=java]NodeList nList = doc.getElementsByTagName("staff");
for (int temp = 0; temp < nList.getLength(); temp++) {
Node nNode = nList.item(temp);
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
String firstname1 = eElement.getElementsByTagName("firstname").item(0).getTextContent();
}
}
String[] data = new String[] { firstname1 };[/syntax]

будет ли правильно?

Аватара пользователя
beks000
Сообщения: 75
Зарегистрирован: 26 апр 2013, 18:15
Контактная информация:

Re: XMLDOM и String[] data

Сообщение beks000 » 31 июл 2014, 19:27

Ну что, никто не подскажет?

Donart
Сообщения: 114
Зарегистрирован: 06 ноя 2013, 08:59

Re: XMLDOM и String[] data

Сообщение Donart » 31 июл 2014, 19:57

Не пойму, а что циклы уже не работают. :) Чем Вас не устроил способ из 79 урока?

Аватара пользователя
beks000
Сообщения: 75
Зарегистрирован: 26 апр 2013, 18:15
Контактная информация:

Re: XMLDOM и String[] data

Сообщение beks000 » 02 авг 2014, 16:47

Donart писал(а):Не пойму, а что циклы уже не работают. :) Чем Вас не устроил способ из 79 урока?
Посмотрел и не понял...
Извините конечно но я парсить умею
Я прошу подсказать как их в String[] перевести
или хотя бы другие способы подскажите

Donart
Сообщения: 114
Зарегистрирован: 06 ноя 2013, 08:59

Re: XMLDOM и String[] data

Сообщение Donart » 02 авг 2014, 17:12

[syntax=java]NodeList nList = doc.getElementsByTagName("staff");
String[] data = new String[nList.getLength()];
for (int temp = 0; temp < nList.getLength(); temp++) {
Node nNode = nList.item(temp);
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
String firstname1 = eElement.getElementsByTagName("firstname").item(0).getTextContent();
data[temp] = firstname1;
}
}[/syntax]

Аватара пользователя
beks000
Сообщения: 75
Зарегистрирован: 26 апр 2013, 18:15
Контактная информация:

Re: XMLDOM и String[] data

Сообщение beks000 » 04 авг 2014, 20:13

Donart, что то не получается
Когда его перевожу в Стринг для ActionBar Spinner работает, но выводит только первую строчку
а когда для простого Спиннер выдает ошибку [syntax=java]NullPointerException strorage == null[/syntax]

Вот здесь сам код, может подскажете ошибочку
[syntax=java5]
// беру и парсю ХМЛ с карты
try {
File fXmlFile = new File("/mnt/sdcard/RSS.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();

// идет разбор по тэгам
final String writers = getIntent().getStringExtra("writer");

NodeList nl = doc.getElementsByTagName(writers);
data = new String[nl.getLength()];
if (nl != null && nl.getLength() > 0 ) {
for (int i = 0; i < nl.getLength(); i++) {
Element entry = (Element) nl.item(i);
Element novel = (Element)entry.getElementsByTagName("novel").item(0);
Element hero = (Element)entry.getElementsByTagName("hero").item(0);

// вот здесь как ВЫ и сказали перевожу его в String [] data
String novelid = novel.getAttribute("id");
String heroid = hero.getAttribute("id");
String obraz = hero.getAttribute("obraz");
data = novelid;


}
}

} catch (Exception e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}

//------------------------------------------------- здесь код

spinner1 = (Spinner)dialog.getWindow().findViewById(R.id.spinner1);
ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(getBaseContext(),
android.R.layout.simple_spinner_item,
data); // вот здесь
adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

spinner1.setAdapter(adapter1);[/syntax]

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: XMLDOM и String[] data

Сообщение altwin » 04 авг 2014, 21:02

[syntax=java5]
private Hashtable<String, String> readAtributes(Element data, String tag) {
Hashtable<String, String> dataReaded = new Hashtable<String, String>();

NodeList nodelist = data.getElementsByTagName(tag);

for (int i = 0; i < nodelist.getLength(); i++) {
Node n = nodelist.item(i);
if (n instanceof Element && n.hasAttributes()) {
NamedNodeMap attrs = n.getAttributes();
for (int j = 0; j < attrs.getLength(); j++) {
Attr attribute = (Attr) attrs.item(j);
dataReaded.put(attribute.getName(), attribute.getValue());
}
}
}
return dataReaded;
}[/syntax]
В результате Hashtable - содержит объекты <XmlТег, Содержимое>
Изображение

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: XMLDOM и String[] data

Сообщение Mikhail_dev » 05 авг 2014, 09:25

Артём, а почему Hashtable, а не HashMap? Ну или ConcurrentHashMap?

Donart
Сообщения: 114
Зарегистрирован: 06 ноя 2013, 08:59

Re: XMLDOM и String[] data

Сообщение Donart » 05 авг 2014, 11:34

что то не получается
Не пойму что делает Ваш код :) Мне кажется Вы пытаетесь пройтись по одному NodeListу и вытащить разом все значения и атрибуты из всех тегов. Попробуйте закоментить эти строки
[syntax=java5]NodeList nl = doc.getElementsByTagName(writers);
data = new String[nl.getLength()];
if (nl != null && nl.getLength() > 0 ) {
for (int i = 0; i < nl.getLength(); i++) {
Element entry = (Element) nl.item(i); //Вот здесь у Вас какой-то node! из getIntent().getStringExtra("writer") Надеюсь он верный
Element novel = (Element)entry.getElementsByTagName("novel").item(0);
// Element hero = (Element)entry.getElementsByTagName("hero").item(0); //так не будет работать

String novelid = novel.getAttribute("id");
// String heroid = hero.getAttribute("id");
// String obraz = hero.getAttribute("obraz");
data = novelid;
}
}[/syntax]
http://stackoverflow.com/questions/6604 ... entbuilder

Аватара пользователя
beks000
Сообщения: 75
Зарегистрирован: 26 апр 2013, 18:15
Контактная информация:

Re: XMLDOM и String[] data

Сообщение beks000 » 05 авг 2014, 14:25

Donart писал(а):Не пойму что делает Ваш код :)
:D я тоже иногда, хех
Мне кажется Вы пытаетесь пройтись по одному NodeListу и вытащить разом все значения и атрибуты из всех тегов.
А что так нельзя? эх ;)
Element entry = (Element) nl.item(i); //Вот здесь у Вас какой-то node! из getIntent().getStringExtra("writer") Надеюсь он верный
вот он:
[syntax=java5]public void onItemClick(AdapterView<?> parent, View itemClicked, int position,
long id) {
int number = position + 1;
Intent intent = new Intent(getBaseContext(), NewActivity.class);
String nummer = "writer" + number;
intent.putExtra("writer", nummer);
startActivity(intent);
}
//-------------- в след активити
final String writers = getIntent().getStringExtra("writer");
NodeList nl = doc.getElementsByTagName(writers);[/syntax]
Последний раз редактировалось beks000 07 авг 2014, 18:31, всего редактировалось 2 раза.

Donart
Сообщения: 114
Зарегистрирован: 06 ноя 2013, 08:59

Re: XMLDOM и String[] data

Сообщение Donart » 05 авг 2014, 16:03

А что так нельзя? эх ;)
Можно, но не в Вашем случае :) У Вас hero вложен в novel. Я дал ссылку, Вам надо всего два цикла чтобы получить переменные novelid, heroid и obraz. Не пойму зачем Вам writer, если в нем ничего нет, и если в дальшейшем не предвидится, то идите сразу по тегам с novel. Готовый код не дам, но у меня все работает :lol:

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: XMLDOM и String[] data

Сообщение altwin » 05 авг 2014, 16:04

Mikhail_dev писал(а):Артём, а почему Hashtable, а не HashMap? Ну или ConcurrentHashMap?
HashTable - базовая структура, HashMap - та же фигня, но выполняется асинхронно и допускает null, во первых парсинг итак выполняется в бекграунд и потому дополнительное распаралеливание избыточно, во вторых я почему то привык, что если null и допускать, то только явно и пустые значения мне в принципе не нужны. ConcurrentHashMap не принимает null, но опять таки нафига мне его не блокирующие потоки - не ясно, потому в android, HashMap как по мне избыточен да и всетаки я предпочел бы блокирующие операции в работе с файлами.
Изображение

Ответить