2013-07-17 2 views
1

I'v следующая строка:Найти XML-тег, который не закрыт в Java

<table:table-cell table:style-name="Table2.A1" office:value-type="string"> 
    <text:p text:style-name="P32"> 
     <text:span text:style-name="T1">test description</text:span> 
     <text:span text:style-name="T2"> </text:span> 
     <text:span text:style-name="T1">17/07/2013</text:span> 
     <text:span text:style-name="T2"> </text:span> 
     <text:span text:style-name="T1">test</text:span> 
     <text:span text:style-name="T2"> </text:span> 
     <text:span text:style-name="T1">test</text:span> 
     <text:span text:style-name="T3"></text:span> 
     <text:span text:style-name="T1">test</text:span> 
     <text:span text:style-name="T3">test <!-- end tag is missing --> 
    </text:p> 
</table:table-cell> 

Есть ли способ, чтобы найти незаконченный тег и вставить его?

Ожидаемый результат:

<table:table-cell table:style-name="Table2.A1" office:value-type="string"> 
    <text:p text:style-name="P32"> 
     <text:span text:style-name="T1">test description</text:span> 
     <text:span text:style-name="T2"> </text:span> 
     <text:span text:style-name="T1">17/07/2013</text:span> 
     <text:span text:style-name="T2"> </text:span> 
     <text:span text:style-name="T1">test</text:span> 
     <text:span text:style-name="T2"> </text:span> 
     <text:span text:style-name="T1">test</text:span> 
     <text:span text:style-name="T3"></text:span> 
     <text:span text:style-name="T1">test</text:span> 
     <text:span text:style-name="T3">test</text:span> 
    </text:p> 
</table:table-cell> 

Заранее спасибо

+2

как вы можете найти что-то * отсутствующий *? – HennyH

+1

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags :) – bobah

+0

@HennyH, возможно – Reddy

ответ

1

очень простое и осуществимое решение заключается в использовании любого из Avaiable снисходительного «HTML» SAXreaders:

  1. TagSoup или
  2. HTML tidy

Я считаю, что оба обеспечивает (я уверен, что TagSoup делает) реализацию XmlReader, что очень снисходительный в какой «брутальный» «HTML» они принимают, и они всегда будут создать хорошо сформированный XML (XHTML). Например, так вы можете использовать DOM4J вместе с TagSoup для «исправления» недопустимого ввода.

SAXReader reader = new SAXReader(
      org.ccil.cowan.tagsoup.Parser.class.getName()); 
    Document doc = reader.read(...); 
    XMLWriter writer = new XMLWriter(System.out); 
    writer.write(doc); 

Учитывая ваш вклад, она производит:

<table:table-cell xmlns:table="urn:x-prefix:table" xmlns:html="http://www.w3.org/1999/xhtml" xmlns:office="urn:x-prefix:office" table:style-name="Table2.A1" office:value-type="string"> 
    <text:p xmlns:text="urn:x-prefix:text" text:style-name="P32"> 
     <text:span text:style-name="T1">test description</text:span> 
     <text:span text:style-name="T2"> </text:span> 
     <text:span text:style-name="T1">17/07/2013</text:span> 
     <text:span text:style-name="T2"> </text:span> 
     <text:span text:style-name="T1">test</text:span> 
     <text:span text:style-name="T2"> </text:span> 
     <text:span text:style-name="T1">test</text:span> 
     <text:span text:style-name="T3"></text:span> 
     <text:span text:style-name="T1">test</text:span> 
     <text:span text:style-name="T3">test <!-- end tag is missing --> 
    </text:span></text:p> 
</table:table-cell> 
+0

Это работает! Благодаря :) – Daniel

2

Да. Это вполне возможно.

Основная проблема в разработке программного обеспечения/Структуры данных. Используйте Stack, чтобы сохранить теги и проверить, закрыты ли они правильно или нет.

  1. Нажмите ее, как только вы вошли открывающий тег
  2. Pop, как только вы вошли в закрывающем тег и сравните с тем, чтобы проверить это правильно закрыто

Я дал основную идею, и это путь к вашему решению

+0

Я использовал 'XMLInputFactory' и' XMLEventReader' для загрузки моего XML. когда я вызываю 'eventReader.nextEvent()' i получает свое событие, которое может быть Start или EndElement. Если тег не закрыт, я получаю excpetion, но на данный момент я не знаю, что делать. В конце мне нужна строка, представляющая действительный файл XML. – Daniel

+0

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

+0

Я использовал этот пример http: // stackoverflow.com/questions/13083756/how-to-find-unclosed-tags-in-xml-with-java, но когда я получаю исключение, я не знаю, как добавить тег – Daniel

Смежные вопросы