Помогите выполнить задание на Java
И задание таки непонятно сформулировано. Приведи пример инпута и соотв желаемого аутпута.
у меня есть еще 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
Я азов то не понимаю. Вычитала, что можно код писать в обычном блокноте, но где его запускать? как его запускать?
Скачай любую среду разработки, например, Eclipse. Там создай новый проект (консольное java-приложение для пуска будет соответствующий пункт меню.
Как человеку, который не знает, что нужно для компиляции и запуска, дали задание на парсинг xml?
Это, действительно, несложно, но, азы-то должны были перед этим дать.
для компиляции нужно jdk, для запуска - jre.
в jdk обычно входит документация на все стандартные классы.
но удобнее пользоваться, как уже выше написали - ide
я ходила на собеседования и будущие работодатели хотят проверить, как быстро я могу обучаться. Я не против, сделать все сама, просто подскажите, где о чем почитать, чтобы суметь справится с таким заданием.
Ну, как уже верно сказали, сначала тебе нужно скачать JDK (jre, кстати, входит в jdk, так что его отдельно скачивать не надо).
Потом лучше поставить среду для разработки: IntelliJ Idea или Eclipse (я лично предпочитаю первый вариант) - это гораздо удобнее, чем в блокноте
Потом посмотри туториалы по SAX и DOM. Это два разных подхода к парсингу XML - первый меньше памяти использует, второй более гибкий. Но так как у тебя к xml нет никаких дополнительных требований, то сможешь использовать тот, который покажется понятнее и удобнее.
Да, о программировании я понятие имею. Спасибо за информацию. Сейчас буду пробовать.
SAX и DOMа если ее предложили вычислть число ПИ, ты бы предложил написать:
System.out.println(Math.PI) ?
ей явно дали задание на логику и умение составления алгоритмов, а это значит что она вручную должна парсить без использования уже написанных классов для этого.
Конешно, если ты начнеш изобретать колесо то ведущий программист тебе ебальник набьет. Но вот начальник при виде индуского кода расплывается в улыбке
неплохой туториал с обзором различных подходов.
Он, правда, довольно старый, но думаю, что с тех пор интерфейсы не особо изменились. Единственное, если я правильно помню, то можешь пропустить этап скачивания дополнительных библиотек - сейчас в Java, вроде, по умолчанию включены реализации и sax, и dom парсеров. Поправьте кто-нибудь, если я не прав.
Вот, вроде, Он, правда, довольно старый, но думаю, что с тех пор интерфейсы не особо изменились. Единственное, если я правильно помню, то можешь пропустить этап скачивания дополнительных библиотек - сейчас в Java, вроде, по умолчанию включены реализации и sax, и dom парсеров. Поправьте кто-нибудь, если я не прав.
ей явно дали задание на логику и умение составления алгоритмов, а это значит что она вручную должна парсить без использования уже написанных классов для этого.
Написать функцию на java, использовать стандартные классы java, для работы c xml.
ей явно дали задание на логику и умение составления алгоритмов, а это значит что она вручную должна парсить без использования уже написанных классов для этого.На логику и умение составлять алгоритмы дают другие задачи.
Она же написала:
будущие работодатели хотят проверить, как быстро я могу обучаться
Написать свой парсер xml != умение обучаться. Я бы даже сказал, что это будет говорить об обратном.
ей явно дали задание на логику и умение составления алгоритмов, а это значит что она вручную должна парсить без использования уже написанных классов для этого.в задании не было сказано, что можно пользоваться компилятором, только блокнотом, поэтому нужно его тоже реализовать самому?
думаю, если было бы необходимо написать парсер, это было бы сказано явно. а парсер хмл — не алгоритмическая, а инженерная задача.
ставишь 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
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 и сохраняли их в коллекцию.
Если будут еще вопросы - спрашивай, постараюсь ответить.
Я сделала еще через DOM. С SAX что-то не разобралась.
Кстати, можешь посоветовать хорошую книгу, по которой можно осваивать java самостоятельно?
Да я хз, вот эта ничо наверное
Кстати, можешь посоветовать хорошую книгу, по которой можно осваивать java самостоятельно?"Thinking in Java" я читал в свое время когда делал на ней тестовые задания.
Это лучшая книга для изучения java
"Thinking in Java"
читать xml не через схему - не моветон ли?
А она написана для изучения "с нуля", или для тех, для кого это лишь один из новых языков?
Что плохого? Можно дописать в парсер валидацию, но в любом случае топикстартер dtd-файл не предоставил.
Вот для произвольного содержания:
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");
}
}
Лучше, пожалуй, и правда не найти.
читать xml не через схему - не моветон ли?через схему - это как?
ps xpath - выбор настоящего джедая. самое правильное - xslt, но это, к сожалению, выпадает из скоупа "стандартных классов джавы".
а я могу на пхп
через схему - это как?Берешь схему, по ней генерится интерфейс, потом ты скармливаешь парсеру текст хмл, он на выходе дает класс, реализующий интерфейс, или бросает исключение. На ТОЙ стороне тоже должны писать в хмл через схему. Такое построение работы избавляет от большинства рутины, и исключает косяки типа несоответствия типов.
это xml binding называется, и, увы, в "стандартной джаве" отсутствует
но штука хорошая, согласен
Оставить комментарий
Privezentsev
Привет, помогите мне выполнить задание по яве. Я в ней полный ноль.Вот само задание:
Написать функцию на java, использовать стандартные классы java, для работы c xml.
Входные данные : xml-файл.
Что делает эта функция:
Распарсить, т.е. извлечь данные из входного xml-файла,
и поместить полученные из файла данные, например, в массива строк.
Выходные данные : массив строк, в каждой строке, чтобы было name и value, через какой-нибудь разделитель, например " - ".