Синтаксический анализ XML при изменении внутренних тегов

#xml #xml-parsing #jaxb

#xml #xml-синтаксический анализ #jaxb

Вопрос:

У меня есть вариант использования, в котором я хочу проанализировать XML-файл следующего вида и создать из него HTML-отчет.

 <?xml version = '1.0'?>
<outer tag>
<first_tag>
  <some Random xml tag>
         <another tag>
         </another tag>
  </some Random xml tag>
</first_tag>
<first_tag>
  <some Random xml tag>
         <another tag>
         </another tag>
  </some Random xml tag>
</first_tag>
<second_tag>
  <some Random xml tag>
         <another tag>
         </another tag>
  </some Random xml tag>
</second_tag>
  

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

Мой html должен выглядеть так:

   Elements inside outer_tag
      First_tag children 
        " <some Random xml tag>
           <another tag>
           </another tag>
         </some Random xml tag>  "  // XML structure itself 
      First_tag children :

        " <some Random xml tag>
           <another tag>
           </another tag>
         </some Random xml tag>  "  // XML structure itself 
        Second_Tag children :

        " <some Random xml tag>
           <another tag>
           </another tag>
         </some Random xml tag>  "  // XML structure itself 
  

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

Ответ №1:

Преобразование XSL будет отлично работать в этом сценарии. XSLT обычно используется для преобразования XML в другие форматы, такие как HTML. Вот преобразование, которое даст вам то, что вы хотите:

 <?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output indent="yes"/>
    <xsl:template match="first_tag|second_tag">
        <xsl:copy-of select="./*"/>            
    </xsl:template>
</xsl:transform>
  

Посмотрите, как это работает здесь: http://xsltransform.net/jyH9rLS