Как я могу извлечь все PCDATA (текст) из файла XML в Java? - PullRequest
2 голосов
/ 13 мая 2011

У меня есть куча файлов XML вместе с DTD, каждый из которых имеет раздел <TEXT>. DTD для элемента TEXT выглядит следующим образом:

<!ELEMENT TEXT - - (AGENCY* | ACTION* | SUMMARY* | DATE* | FOOTNAME* | FURTHER* | SIGNER* | SIGNJOB* | FRFILING* | BILLING* | FOOTNOTE* | FOOTCITE* | TABLE* | ADDRESS* | IMPORT* | #PCDATA)+ >

Вот как будет выглядеть пример XML-файла:

<ROOT>
  ...
  <TEXT>
  Some text that I want to extract
  <SUMMARY> Some more text </SUMMARY>
  <AGENCY> 
     An agency
     <SIGNER> Bob Smith </SIGNER>
  </AGENCY>
  </TEXT>
  ...
</ROOT>

В конце хочу извлечь

Некоторый текст, который я хочу извлечь Еще немного текста Агентство Боб Смит

Однако каждый блок <TEXT> явно не одинаков с точки зрения элементов / порядка или того, как далеко вы идете. Есть ли способ в Java с использованием DOM, что я могу сделать это? Я бы предпочел использовать DOM вместо SAX, но если гораздо проще использовать SAX, пусть будет так.

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

Ответы [ 2 ]

2 голосов
/ 13 мая 2011

Будет работать таблица стилей XSLT:

ОБНОВЛЕНИЕ № 2: Я сомневаюсь, что это будет работать для вас, так как вы на самом деле используете SGML, а не XML. Выдача в том, что объявление элемента в вашем вопросе имеет минимизацию тегов, которая недопустима в XML.

ОБНОВЛЕНИЕ: изменен ввод XML и XSLT для отображения только текста в структуре <TEXT>.

XML INPUT

<ROOT>
  <IGNORE>ignore this data</IGNORE>
  <TEXT>
    Some text that I want to extract
    <SUMMARY> Some more text </SUMMARY>
    <AGENCY> 
      An agency
      <SIGNER> Bob Smith </SIGNER>
    </AGENCY>
  </TEXT>
  <IGNORE>ignore this data</IGNORE>
</ROOT>

XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>

  <xsl:template match="/">
    <xsl:value-of select="normalize-space(/ROOT/TEXT)"/>
  </xsl:template>

</xsl:stylesheet>

OUTPUT

Некоторый текст, который я хочу извлечь. больше текста Агентство Боб Смит

Примечание. XSLT работает только в том случае, если TEXT является дочерним элементом ROOT. Если TEXT может быть вложен более глубоко, вы можете изменить «select» на select="normalize-space(//TEXT)".

2 голосов
/ 13 мая 2011

Я не большой поклонник SAX, но для этого, я думаю, это будет хорошо работать.

Просто определите обработчик саксофона, но используйте только метод characters.Затем просто бросьте полученные символы в StringBuilder и все готово.

public class textExtractor extends DefaultHandler {

  private StringBuilder sb = new StringBuilder();

  public void characters(char[] ch, int start, int length){
    for (int i=0; i<length; i++){
      sb.append(ch[i]);
    }
  }

  public String getText(){
    return sb.toString();
  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...