Помогите выполнить задание на Java

Privezentsev

Привет, помогите мне выполнить задание по яве. Я в ней полный ноль.
Вот само задание:
Написать функцию на java, использовать стандартные классы java, для работы c xml.
Входные данные : xml-файл.
Что делает эта функция:
Распарсить, т.е. извлечь данные из входного xml-файла,
и поместить полученные из файла данные, например, в массива строк.
Выходные данные : массив строк, в каждой строке, чтобы было name и value, через какой-нибудь разделитель, например " - ".

katrin2201

Чем помочь то? За тебя написать?
И задание таки непонятно сформулировано. Приведи пример инпута и соотв желаемого аутпута.

Privezentsev

Рассказать мне, как это вообще делается, я хочу разобраться. Как функцию описать, как загрузить файл, как его обработать.
у меня есть еще xml файл, который надо обработать
<?xml version="1.0" encoding="UTF-8"?>
<step>
<attribute>
<name>EXIF MIME Type</name>
<value>audio/mpeg</value>
</attribute>
<attribute>
<name>EXIF Channel Mode</name>
<value>Stereo</value>
</attribute>
<attribute>
<name>EXIF File Type</name>
<value>MP3</value>
</attribute>
</step

Privezentsev

Я азов то не понимаю. Вычитала, что можно код писать в обычном блокноте, но где его запускать? как его запускать?

okis

Скачай любую среду разработки, например, Eclipse. Там создай новый проект (консольное java-приложение для пуска будет соответствующий пункт меню.

ifani

А откуда вообще такое задание?
Как человеку, который не знает, что нужно для компиляции и запуска, дали задание на парсинг xml?
Это, действительно, несложно, но, азы-то должны были перед этим дать.

serega1604

>Я азов то не понимаю. Вычитала, что можно код писать в обычном блокноте, но где его запускать? как его запускать?
для компиляции нужно jdk, для запуска - jre.
в jdk обычно входит документация на все стандартные классы.
но удобнее пользоваться, как уже выше написали - ide

Privezentsev

я ходила на собеседования и будущие работодатели хотят проверить, как быстро я могу обучаться. Я не против, сделать все сама, просто подскажите, где о чем почитать, чтобы суметь справится с таким заданием.

ifani

А, ну то есть о программировании вообще ты имеешь представление? :)
Ну, как уже верно сказали, сначала тебе нужно скачать JDK (jre, кстати, входит в jdk, так что его отдельно скачивать не надо).
Потом лучше поставить среду для разработки: IntelliJ Idea или Eclipse (я лично предпочитаю первый вариант) - это гораздо удобнее, чем в блокноте :)
Потом посмотри туториалы по SAX и DOM. Это два разных подхода к парсингу XML - первый меньше памяти использует, второй более гибкий. Но так как у тебя к xml нет никаких дополнительных требований, то сможешь использовать тот, который покажется понятнее и удобнее.

Privezentsev

Да, о программировании я понятие имею. Спасибо за информацию. Сейчас буду пробовать.

stm6692945

SAX и DOM
а если ее предложили вычислть число ПИ, ты бы предложил написать:
System.out.println(Math.PI) ?
ей явно дали задание на логику и умение составления алгоритмов, а это значит что она вручную должна парсить без использования уже написанных классов для этого.
Конешно, если ты начнеш изобретать колесо то ведущий программист тебе ебальник набьет. Но вот начальник при виде индуского кода расплывается в улыбке

ifani

Вот, вроде, неплохой туториал с обзором различных подходов.
Он, правда, довольно старый, но думаю, что с тех пор интерфейсы не особо изменились. Единственное, если я правильно помню, то можешь пропустить этап скачивания дополнительных библиотек - сейчас в Java, вроде, по умолчанию включены реализации и sax, и dom парсеров. Поправьте кто-нибудь, если я не прав.

fisher555

ей явно дали задание на логику и умение составления алгоритмов, а это значит что она вручную должна парсить без использования уже написанных классов для этого.
Написать функцию на java, использовать стандартные классы java, для работы c xml.

ifani

ей явно дали задание на логику и умение составления алгоритмов, а это значит что она вручную должна парсить без использования уже написанных классов для этого.
На логику и умение составлять алгоритмы дают другие задачи.
Она же написала:
 
будущие работодатели хотят проверить, как быстро я могу обучаться

Написать свой парсер xml != умение обучаться. Я бы даже сказал, что это будет говорить об обратном.

okis

ей явно дали задание на логику и умение составления алгоритмов, а это значит что она вручную должна парсить без использования уже написанных классов для этого.
в задании не было сказано, что можно пользоваться компилятором, только блокнотом, поэтому нужно его тоже реализовать самому?
думаю, если было бы необходимо написать парсер, это было бы сказано явно. а парсер хмл — не алгоритмическая, а инженерная задача.

katrin2201

ставишь интеллиджей
ставишь jdk с включенной галочкой documentation
создаешь проект в интеллиджей
<ctrl-alt-shift-s> прописываешь в интеллиджей установленный jdk
создаешь класс Main
пишешь внутри psvm, сразу после того как написала жмешь <Tab>
внутри полученной функции пишешь sout<Tab>Hello, World
пока курсор внутри функции - жмешь <ctrl-shift-f10>
если все правильно сделано, то квест на хелло ворлд будет пройден
А дальше уже чтение док и креатив:
<ctrl-n>, <alt-n>, FileReader, <Ctrl-Q> и втыкаешь
<ctrl-n>, <alt-n>, String, <enter>, <ctrl-f12>, и скролишься по списку методов нажимая <ctrl-q> на приглянувшихся. рекомендую прглядеться к matches и replaceAll

stm6692945

Привет. Вот через SAXParser

public class XMLTask
{
public static void main(String[] args) throws Exception
{
FileInputStream fis = new FileInputStream("xmltask.xml");
XMLTaskHandler xmlth = new XMLTaskHandler;

SAXParserFactory sf = SAXParserFactory.newInstance;
SAXParser parser = sf.newSAXParser;

parser.parse(fis, xmlth);
fis.close;

for(String s: xmlth.xml_data) System.out.println(s);
}
}

class XMLTaskHandler extends DefaultHandler
{
ArrayList<String> xml_data = new ArrayList<String>

private boolean is_name_obtain = false;
private StringBuilder current_name = new StringBuilder;

private boolean is_value_obtain = false;
private StringBuilder current_value = new StringBuilder;

public void startElement(String uri, String local_name, String raw_name, Attributes amap)
throws SAXException
{
if("name".equals(raw_name {
is_name_obtain = true;
is_value_obtain = false;
}
else if("value".equals(raw_name {
is_name_obtain = false;
is_value_obtain = true;
}
}

public void characters(char[] ch, int start, int length) throws SAXException
{
String data_chunk = new String(ch, start, length);
if(is_name_obtain) current_name.append(data_chunk);
else if(is_value_obtain) current_value.append(data_chunk);
}

public void endElement(String uri, String local_name, String raw_name) throws SAXException
{
if("attribute".equals(raw_name
{
xml_data.add(current_name.toString.trim+" - "+current_value.toString.trim;

is_name_obtain = false;
current_name = new StringBuilder;

is_value_obtain = false;
current_value = new StringBuilder;
}
}
}

В xmltask.xml твоя xml-ка, что ты тут постила.
output:

EXIF MIME Type - audio/mpeg
EXIF Channel Mode - Stereo
EXIF File Type - MP3

Сакспарсер простой как три копейки. Объекту класса SAXParser в метод parse отдается файл, который будем парсить и экземпляр нашего собственного класса, который должен быть потомком класса DefaultHandler - в примере это XMLTaskHandler. Парсер читает файл построчно, и когда встречает открывающий тег - вызывает метод startElement, отдавая ему имя тега и все внутренние аттрибуты. Когда встречает закрывающий тег - вызывает метод endElement. Когда встречает что-то между тегами, вызывает метод characters. Еще в начале и в конце парсинга вызывает методы startDocument и endDocument.
Вот и все. Остается только в нашем потомке DefaultHandler'а переопределить эти методы, чтобы они делали что-то нужное нам. В твоем случае - читали инфу между тегами name и value и сохраняли их в коллекцию.
Если будут еще вопросы - спрашивай, постараюсь ответить.

Privezentsev

Спасибо огромное :)
Я сделала еще через DOM. С SAX что-то не разобралась.
Кстати, можешь посоветовать хорошую книгу, по которой можно осваивать java самостоятельно?

stm6692945

Да я хз, вот эта ничо наверное

pilot

Кстати, можешь посоветовать хорошую книгу, по которой можно осваивать java самостоятельно?
"Thinking in Java" я читал в свое время когда делал на ней тестовые задания. :)

voronetskaya


"Thinking in Java"
Это лучшая книга для изучения java

kill-still

читать xml не через схему - не моветон ли?

kill-still

А она написана для изучения "с нуля", или для тех, для кого это лишь один из новых языков?

stm6692945

Что плохого? Можно дописать в парсер валидацию, но в любом случае топикстартер dtd-файл не предоставил.

stm6692945

Мой первый вариант был плох, так как он искал только определенные теги (name и value)
Вот для произвольного содержания:


package XML;


import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;
public class SAX
extends DefaultHandler
{
public void parseURI(String uri)
{
try
{
SAXParserFactory spf = SAXParserFactory.newInstance;
SAXParser sp = spf.newSAXParser;
sp.parse(uri, this);
}
catch (Exception e)
{
System.err.println(e);
}
}

public void startDocument
{
System.out.println("<?xml version=\"1.0\"?>");
}


public void startElement(String namespaceURI, String localName,
String rawName, Attributes attrs)
{
System.out.print("<");
System.out.print(rawName);
if (attrs != null)
{
int len = attrs.getLength;
for (int i = 0; i < len; i++)
{
System.out.print(" ");
System.out.print(attrs.getQName(i;
System.out.print("=\"");
System.out.print(attrs.getValue(i;
System.out.print("\"");
}
}
System.out.print(">");
}

public void characters(char ch[], int start, int length)
{
System.out.print(new String(ch, start, length;
}


public void ignorableWhitespace(char ch[], int start, int length)
{
characters(ch, start, length);
}


public void endElement(String namespaceURI, String localName,
String rawName)
{
System.out.print("</");
System.out.print(rawName);
System.out.print(">");
}


public void endDocument
{

}


public void processingInstruction(String target, String data)
{
System.out.print("<?");
System.out.print(target);
if (data != null && data.length > 0)
{
System.out.print(' ');
System.out.print(data);
}
System.out.print("?>");

}


public void warning(SAXParseException ex)
{
System.err.println("[Warning] "+
getLocationString(ex)+": "+
ex.getMessage;
}


public void error(SAXParseException ex)
{
System.err.println("[Error] "+
getLocationString(ex)+": "+
ex.getMessage;
}


public void fatalError(SAXParseException ex)
throws SAXException
{
System.err.println("[Fatal Error] "+
getLocationString(ex)+": "+
ex.getMessage;
throw ex;
}


private String getLocationString(SAXParseException ex)
{
StringBuffer str = new StringBuffer;

String systemId = ex.getSystemId;
if (systemId != null)
{
int index = systemId.lastIndexOf('/');
if (index != -1)
systemId = systemId.substring(index + 1);
str.append(systemId);
}
str.append(':');
str.append(ex.getLineNumber;
str.append(':');
str.append(ex.getColumnNumber;

return str.toString;
}


public static void main(String argv[])
{

SAX s1 = new SAX;
s1.parseURI("DOM1.xml");
}
}

katrin2201

Может не совсем прямо с нуля (какое-то представление о том, что происходит, лучше иметь - например как хелловорлд сделать там, кажется, не говорят зато все языковые конструкции _очень_ подробно разжевываются. И java core покрыт очень неплохо, в расчете на начинающего как раз.
Лучше, пожалуй, и правда не найти.

katrin2201

читать xml не через схему - не моветон ли?
через схему - это как?
ps xpath - выбор настоящего джедая. самое правильное - xslt, но это, к сожалению, выпадает из скоупа "стандартных классов джавы".

PooH

а я могу на пхп :p

kill-still

через схему - это как?
Берешь схему, по ней генерится интерфейс, потом ты скармливаешь парсеру текст хмл, он на выходе дает класс, реализующий интерфейс, или бросает исключение. На ТОЙ стороне тоже должны писать в хмл через схему. Такое построение работы избавляет от большинства рутины, и исключает косяки типа несоответствия типов.

katrin2201

[зануд моуд]
это xml binding называется, и, увы, в "стандартной джаве" отсутствует
но штука хорошая, согласен
Оставить комментарий
Имя или ник:
Комментарий: