Souvik Bhattacharya Ответов: 2

Как преобразовать текстовый файл в XML


Привет,
Меня попросили преобразовать текстовый файл в формат

10_1 а;б&ЛТ;&ГТ;компакт&ЛТ;&ГТ;эф

быть преобразованным в xml как

<ID> 10_1 </ID>
<имя>
<Name1> a </Name1>
<Name2> b </Name2>
</имя>
&ЛТ;Деф&ГТ; компакт &ЛТ;/деф&ГТ;
&ЛТ;вен&ГТ; эф &ЛТ;/преп&ГТ;

У меня возникли проблемы с разбором первой части проблемы, разделением идентификатора и имени.

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

Что я уже пробовал:

public class ToXML {

	BufferedReader in;
	StreamResult out;
	TransformerHandler th;
	AttributesImpl atts;

	public static void main(String args[]) {
		new ToXML().doit();
	}

	public void doit() {
		try {
			in = new BufferedReader(new FileReader("E.txt"));
			out = new StreamResult("E.xml");
			initXML();
			String str;
			while ((str = in.readLine()) != null) {
				process(str);
			}
			in.close();
			closeXML();
		} catch (IOException | ParserConfigurationException | TransformerConfigurationException | SAXException e) {
		}
	}

	public void initXML() throws ParserConfigurationException,
			TransformerConfigurationException, SAXException {
		SAXTransformerFactory tf = (SAXTransformerFactory) SAXTransformerFactory
				.newInstance();

		th = tf.newTransformerHandler();
		Transformer serializer = th.getTransformer();
		serializer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");
		serializer.setOutputProperty(
				"{http://xml.apache.org/xslt}indent-amount", "4");
		serializer.setOutputProperty(OutputKeys.INDENT, "yes");
		th.setResult(out);
		th.startDocument();
		atts = new AttributesImpl();
		th.startElement("", "", "Author", atts);
	}

	public void process(String s) throws SAXException {
		String[] elements = s.split("<>;");
		atts.clear();
		th.startElement("", "", "Data", atts);
		th.startElement("", "", "Bibliofile", atts);
		th.characters(elements[0].toCharArray(), 0, elements[0].length());
		th.endElement("", "", "Bibliofile");
		th.endElement("", "", "Data");
	}

	public void closeXML() throws SAXException {
		th.endElement("", "", "Author");
		th.endDocument();
	}
}

Maciej Los

Улучшите свой вопрос и обеспечьте правильную структуру xml-данных

Richard MacCutchan

- У меня постоянно возникают проблемы с ошибками."
Ну, боюсь, здесь никто не догадается, что это такое.

Souvik Bhattacharya

Я думаю, что я очень четко разместил свой запрос выше. Сначала прочтите все целиком. Вы поймете, что я имел в виду.

Richard MacCutchan

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

Souvik Bhattacharya

Я хочу отделить свой текстовый файл в приведенном выше формате xml. Код, который я написал, дает xml-версию текста, но ничего близкого к тому формату, который я упомянул. Что же мне делать?

Richard MacCutchan

У меня есть предложение. Забудьте на минуту о XML. Просто напишите код, чтобы разделить строку(ы) на части, которые вас интересуют, и распечатайте их по мере обработки. Таким образом, вы действительно можете увидеть, правильно ли работает ваш синтаксический анализ. Если у вас есть правильные элементы в правильном порядке, то добавление кода для создания XML должно быть простым делом.

2 Ответов

Рейтинг:
1

Maciej Los

Исходя из этого: Как разделить строку в Java: String Split with multiple characters using Regex solution by Ravindra babu[^] я бы попробовал что-нибудь вроде этого:

String line = "10_1 a;b<>cd<>ef";
//String delimiters = "[ \\;\\<>]";
String delimiters = "[\\s\\;\\<>]";

String[] result = line.split(delimiters);
String xmlContent = "<Root><ID>" + result[0] + "</ID>";
xmlContent += "<Name><Name1>" + result[1] + "</Name1>";
xmlContent += "<Name2>" + result[2] + "</Name2></Name>";
xmlContent += "<Def>" + result[3] + "</Def>";
xmlContent += "<Ven>" + result[4] + "</Ven></Root>";
System.out.println(xmlContent);


Примечание: не тестировалось, но оно тоже должно работать!


Souvik Bhattacharya

То, что вы опубликовали, занимает только первую строку текстового файла. У меня есть еще 500 в том же самом порядке.

Maciej Los

Да, потому что я использовал только одну строку!
Вы должны прочитать строки из файла (строка за строкой) и продолжить каждую отдельную строку, как указано в приведенном выше коде.
Подумай об этом!

Souvik Bhattacharya

Окей. Спасибо!

Maciej Los

Всегда пожалуйста.
Пожалуйста, примите мое решение (зеленая кнопка), если оно было полезным.

Рейтинг:
0

Jochen Arndt

Используйте регулярное выражение (непроверенное: "(.+?) (.+?);(.+?)<>(.+?)<>(.+)") или разделить несколько раз:

  1. Разделите пробелом, чтобы получить идентификатор и оставшуюся часть
  2. Разделите оставшуюся часть на "< & gt;"
  3. Разделите первую часть из вышеперечисленного на";", чтобы получить два имени
  4. Две другие части-это поля бумаги и задачи

[РЕДАКТИРОВАТЬ]
Если вы не используете метод регулярных выражений, то разбиение на пробел с первого шага должно выполняться "вручную" путем нахождения первого символа пробела во входной строке, а не с помощью String.Split() В противном случае "оставшаяся часть" может состоять из нескольких подстрок, когда во входной строке больше пробелов .
[/РЕДАКТИРОВАТЬ]


Souvik Bhattacharya

Не могли бы вы сказать мне, где я могу применить эту функцию?

Jochen Arndt

Код должен быть в вашей функции process (), где вы обрабатываете одну входную строку.

Пока я об этом думаю:
Разделение по пространству будет работать для идентификатора, но может создать несколько оставшихся частей, когда они тоже содержат пробелы. Я обновлю свой ответ.

Souvik Bhattacharya

Я так и сделал, нынешнее обновление заключается в том, что он просто считывает идентификатор. И больше ничего не показывает.

Jochen Arndt

Помните, что я не могу видеть ваш код / экран. Так что я не знаю, что вы делаете неправильно.

Но даже в вашем начальном примере вы использовали только элементы[0], а не дополнительные подстроки.

Попробуйте что-то вроде этого (непроверенное с нуля без проверки ошибок)
int pos = s.indexOf(' ');
String sID = s.substring(0, pos);
// All after the first space
String sRemain = s.substring(pos + 1);
// Get Names, Def, and Ven
String[] elements = sRemain.split("<>");
// Get Name1 and Name2
String[] names = elements[0].split(";");
// Name1 in names[0]
// Name2 in names[1]
// Def in elements[1]
// Ven in elements[2]

Souvik Bhattacharya

Я вставил весь свой код. Ты этого хотел?

Jochen Arndt

Мне ничего не хотелось :)

Но есть две вещи:

Не публикуйте такие сообщения, как решение. Вы можете отредактировать свой вопрос и добавить туда код (с указанием, как я сделал при обновлении своего решения).

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

Но вы, очевидно, должны понимать массивы.
Если у вас есть массив строк, таких как имена [], то доступ к именам[0] - это строка, а не массив, как в вашем коде.

Комментарии из моего вышеприведенного поста означают:
names[0] содержит строковое значение для Name1. Используйте его везде, где вам это нужно (вероятно, для записи соответствующего XML-узла).