Частично синтаксический анализ XML-файла без XMLParser в JAVA - PullRequest
0 голосов
/ 29 июня 2011

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

Например, глядя на этот пример:

<?xml version="1.0" encoding="UTF-8"?>
<BookCatalogue xmlns="http://www.publishing.org">
    <w:pStyle w:val="TOAHeading" />
    <Book>
    <Title>Yogasana Vijnana: the Science of Yoga</Title>
    <author>Dhirendra Brahmachari</Author>
    <Date>1966</Date>
    <ISBN>81-40-34319-4</ISBN>
    <Publisher>Dhirendra Yoga Publications</Publisher>
    <Cost currency="INR">11.50</Cost>
  </Book>
  <Book>
    <Title>The First and Last Freedom</Title>
    <v:imagedata r:id="rId7" o:title="" croptop="10523f" cropbottom="11721f" /> 
    <Author>J. Krishnamurti</Author>
    <Date>1954</Date>
    <ISBN>0-06-064831-7</ISBN>
    <Publisher>Harper &amp; Row</Publisher>
    <Cost currency="USD">2.95</Cost>
  </Book>
<w:pStyle w:val="TOAHeading2" />
</BookCatalogue> 

Извините, если это неправильный XMLКод, я только что добавил кусочки из документа, на который смотрел, к этому образцу, который нашел.Но в основном, если я хотел найти экземпляр «заголовка» (в данном случае 3-я строка -> TOAHeading), то очистите все от заголовка до тех пор, пока не будет найден другой экземпляр заголовка, и скопируйте его в другой файл XML.Это возможно?Кроме того, если бы я хотел сделать этот временный файл, который я сохраняю, и сохранить этот файл, только если найден экземпляр "изображения" (в данном случае, 14-я строка), это также возможно?Я пытаюсь сделать это как можно проще, у кого-нибудь есть идеи или опыт?Заранее спасибо.

public class IPDriver 
        {
            public static void main(String[] args) throws IOException
            {
                BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStreamReader("C:/Documents and Settings/user/workspace/Intern Project/Proposals/Converted Proposals/Extracted Items/ProposalOne/word/document.xml"), "UTF-8"));
                BufferedWriter writer = new BufferedWriter(new OutputStreamReader(new FileOutputStreamReader("C:/Documents and Settings/user/workspace/Intern Project/Proposals/Converted Proposals/Extracted Items/ProposalOne/word/tempdocument.xml"), "UTF-8"));

                String line = null;

                while ((line = reader.readLine()) != null)
                {
                    writer.write(line);
                }

                // Close to unlock.
                reader.close();
                // Close to unlock and flush to disk.
                writer.close();
            }
        }

Пример из моего актуального XML-документа

- <w:smartTag w:uri="urn:schemas-microsoft-com:office:smarttags" w:element="address">
- <w:smartTag w:uri="urn:schemas-microsoft-com:office:smarttags" w:element="Street">
- <w:r w:rsidRPr="00822244">
  <w:t>6841 Benjamin Franklin Drive</w:t> 
  </w:r>
  </w:smartTag>
  </w:smartTag>
  </w:p>
- <w:p w:rsidR="00B41602" w:rsidRPr="00822244" w:rsidRDefault="00B41602" w:rsidP="007C3A42">
- <w:pPr>
  <w:pStyle w:val="Address" /> 
  </w:pPr>
- <w:smartTag w:uri="urn:schemas-microsoft-com:office:smarttags" w:element="City">
- <w:smartTag w:uri="urn:schemas-microsoft-com:office:smarttags" w:element="place">

Просто ваш базовый файл document.xml из .docx

Ответы [ 4 ]

2 голосов
/ 29 июня 2011

Возможно, вы захотите прочитать о парсерах java XML.Существует два типа парсеров SAX и DOM.

SAX-парсеры «основаны на событиях», это означает, что парсер будет сканировать для вас файл xml и вызывать набор определенных вами методов «обратного вызова», таких как startElement () и endElement ().SAX-парсеры эффективны для очень больших XML-файлов.

Парсеры DOM будут считывать весь XML в память, а затем вы можете просто запросить «объект DOM», вызвав такие методы, как getElementsByTagName ("w: pStyle").С парсерами Dom, как правило, работать немного проще, но они используют больше памяти, чем парсеры SAX.

Будет немного кривой обучения, но это стандартные способы обработки XML в Java.Существуют также библиотеки, разработанные для упрощения стандартных библиотек, такие как JDom.

1 голос
/ 04 июля 2011

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

  • Начните анализ в случаенечувствительное (и потенциально ЧАСТИЧНОЕ) соответствие значения атрибута ;в вашем случае вы хотели сопоставить «заголовок» со второй половиной «TAOHeading».
  • Разбор из этого нечетного начального условия до совпадающего (и одинаково нечетного) конечного условия.

Если я понял ваши требования, вы, по сути, хотели бы провести полностью неструктурированный анализ очень структурированного фрагмента данных (разметка XML).В этом случае использование синтаксического анализатора XML, синтаксического анализатора XSLT, DOM для всего, что написано в соответствии со спецификацией XML, будет трудной задачей, чтобы изменить ваши потребности.

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

Если документы не очень большие (например, 1 МБ или меньше), просто прочитайте всепомещать данные в память в String и либо использовать очень быстрое и грязное использование indexOf для различных версий в оболочке того, что вы хотите, либо прочитать все это в char [] и написать более эффективный код сканирования для case-нечувствительное совпадение с начальным значением, с которого вы хотите начать синтаксический анализ.

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

(ПРИМЕЧАНИЕ: я не говорю, что это ПЛОХО, просто никогда раньше не видел этот запрос. ВыУ вас есть свои причины для этого, и мы просто постараемся помочь;)

1 голос
/ 29 июня 2011

Правильный способ сделать это - использовать преобразование XSLT , которое испускает все, кроме того, что вы не хотите. Это именно то, что XSLT имеет в виду.

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

Если вы не можете понять XLST, и это парадигма перехода от процедурного кодирования, обратитесь за помощью сюда или воспользуйтесь традиционной библиотекой XML-анализа для вашего случая использования, вам, вероятно, придется использовать некоторые * Парсер на основе 1007 *, я предпочитаю JDOM .

1 голос
/ 29 июня 2011

Если вы уверены, что ваш XML выглядит так , вы можете просто сравнить каждую строку с <w:pStyle w:val="TOAHeading" />, а затем начать вывод следующих строк, пока не найдете строку, которая соответствует <w:pStyle w:val="TOAHeading2" />.

Но зачем ты это делаешь?Он хрупок к любым изменениям форматирования. Используйте синтаксический анализатор XML (и средство записи XML), это значительно облегчает жизнь .

...