Печать имен и значений тегов XML в Java

У меня есть XML-документ, и я хочу напечатать имена тегов и значения (листовых узлов) всех тегов в документе.

Например, для XML:

<library>
  <bookrack>
    <book>
      <name>Book1</name>
      <price>$10</price>
    </book>
    <book>
      <name>Book2</name>
      <price>$15</price>
    </book>
  </bookrack>
</library>

Вывод должен быть примерно таким:

library=
bookrack=
book=
name=Book1
price=$10
book=
name=Book2
price=$15

Помоги пожалуйста!


person Phanindra K    schedule 08.07.2009    source источник
comment
Извините за опоздание... но я искал решение на Java... (см. заголовок вопроса) :)   -  person Phanindra K    schedule 08.07.2009
comment
Может быть, мне тоже следовало пометить вопрос как java .. :)   -  person Phanindra K    schedule 08.07.2009
comment
Да, эта информация была бы полезна с самого начала. В любом случае вы можете применить XSLT в Java без проблем. Если вы хотите попробовать этот путь.   -  person Tomalak    schedule 08.07.2009


Ответы (2)


Минималистичный подход XSLT 1.0:

<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="name()" />
    <xsl:text>=</xsl:text>
    <xsl:value-of select="normalize-space(text())" />
    <xsl:text>&#10;</xsl:text>
    <xsl:apply-templates />
  </xsl:template>

  <xsl:template match="text()" />

</xsl:stylesheet>

дает:

library=
bookrack=
book=
name=Book1
price=$10
book=
name=Book2
price=$15

Этот альтернативный шаблон будет лучше обрабатывать значения узла:

<xsl:template match="*">
  <xsl:value-of select="name()" />
  <xsl:text>=</xsl:text>
  <xsl:if test="normalize-space(text()) != ''">
    <xsl:value-of select="text()" />
  </xsl:if>
  <xsl:text>&#10;</xsl:text>
  <xsl:apply-templates />
</xsl:template>

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

person Tomalak    schedule 08.07.2009

если вы можете проанализировать xml с помощью xslt, то это довольно просто (вывод можно изменить на текст, только что использованный html, чтобы можно было легко просмотреть результат)

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="html" encoding="utf-8" />
   <xsl:template match="/">
      <xsl:for-each select="./*">
         <xsl:call-template name="list" />
      </xsl:for-each>
   </xsl:template>
   <xsl:template match="*" name="list">
      <xsl:value-of select="local-name(.)" /> = <xsl:value-of select="text()" /><br />
      <xsl:for-each select="./*">
         <xsl:call-template name="list" />
      </xsl:for-each>
   </xsl:template>
</xsl:stylesheet>

Возвращает:

library = 
bookrack = 
book = 
name = Book1
price = $10
book = 
name = Book2
price = $15
person Josh    schedule 08.07.2009
comment
Спасибо за Ваш ответ! Позвольте мне посмотреть, могу ли я использовать это вместо программы Java.. :) - person Phanindra K; 08.07.2009