【问题标题】:How to list the Node text & Attribute using Java and XPath?如何使用 Java 和 XPath 列出节点文本和属性?
【发布时间】:2011-12-03 05:42:43
【问题描述】:

下面是 XML 文件,我正在接收 -

<Seminars>
  <Seminar>
    <Venue P="ABC" dt="20111223"/>
    <Subject name="Finance">
     <Topic main="Bonds"/>
     <Topic main="Stocks" sub="Technical Analysis"/>
   </Subject>       
  </Seminar>    
  <Seminar>
   <Venue P="ABC" dt="20111225"/>
   <Subject name="Yoga">
     <Topic main="Benefits"/>
   </Subject>
   <Subject name="Meditation">
     <Topic main="Benefits"/>
   </Subject>
  </Seminar>
  <Seminar>
   <Venue P="PQR" dt="20111220"/>       
   <Subject name="IT">
     <Topic main="Java" sub="Swing"/>
     <Topic main="Java" sub="NIO"/>
   </Subject>       
  </Seminar>
  <Seminar>
   <Venue P="ABC" dt="20111224"/>
   <Subject name="Medical">
     <Topic main="Plastic Surgery"/>
     <Topic main="Mal-nutrition"/>
   </Subject>
   <Subject name="IT">
     <Topic main="Java" sub="Collections"/>
     <Topic main="Web Technologies"/>
   </Subject>      </Seminar>
  <Seminar>     
   <Venue P="XYZ" dt="20111226"/>
   <Subject name="IT">
     <Topic main="DotNET - I"/>
     <Topic main="DotNET - II"/>
     <Topic main="XML" sub="Security"/>
   </Subject>       
  </Seminar>
  <Seminar>
   <Venue P="XYZ" dt="20111227"/>
   <Subject name="IT">
     <Topic main="Oracle"/>
     <Topic main="Oracle" sub="JDeveloper"/>
   </Subject>       
  </Seminar>
</Seminars>

我希望输出为 -

Financial
  - Bonds
  - Stocks, Technical Analysis
Yoga
  - Benefits
Meditation  
  - Benefits
IT
  - Java, Swing
  - Java, NIO
Medical
  - Plastic Surgery
  - Mal-nutrition
IT
  - Java, Collections
  - Web Technologies
IT
  - Java - I
  - Java - II
  - XML, Security
IT
  - Oracle, JDeveloper
  - Oracle, Security

下面是我的 Java 代码 -

public class Seminar
{
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, XPathExpressionException 
    {
       DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
       domFactory.setNamespaceAware(true); 
       DocumentBuilder builder = domFactory.newDocumentBuilder();
       Document doc = builder.parse("seminar.xml");
       XPath xpath = XPathFactory.newInstance().newXPath();

       // XPath Query for showing all nodes value
       XPathExpression expr = xpath.compile("//Seminars/Seminar");
       Object result = expr.evaluate(doc, XPathConstants.NODESET);
       NodeList nodes = (NodeList) result;

       //Writing to an output file
       String tx = "";
       BufferedWriter out = new BufferedWriter(new FileWriter("seminar.csv"));

       Node node;

       for (int i = 0; i < nodes.getLength(); i++) 
       {
          node = nodes.item(i);
          String subject = xpath.evaluate("Subject/@name",node);
          String t = xpath.evaluate("Subject/Topic/@main",node);
          String del = xpath.evaluate("Subject/Topic/@sub",node).toString();
          //Writing to the CSV File
          out.write(subject + "," + t + "," + del + "\r\n"); // + "   -   " + dod );
       }        
       out.close();
    }
 }

我无法获得相同的输出。我正在尝试使用 XPATH 和 Java。尽管我正在粘贴一个简单的 Java 程序,但我尝试了很多 XPath 查询的组合。但无法获得所需的输出。我正在使用 JDK 1.7。

任何帮助请...

【问题讨论】:

    标签: java xml xslt xpath


    【解决方案1】:

    好问题,+1。

    使用 XSLT 更容易做到这一点(只需从您的代码中调用 XSLT 转换并输出其结果):

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output method="text"/>
     <xsl:strip-space elements="*"/>
    
     <xsl:template match="Subject">
       <xsl:value-of select="concat('&#xA;',@name)"/>
       <xsl:apply-templates/>
     </xsl:template>
    
     <xsl:template match="Topic">
      <xsl:text>&#xA;  - </xsl:text>
      <xsl:apply-templates select="@*"/>
     </xsl:template>
    
     <xsl:template match="@sub">
      <xsl:value-of select="concat(', ', .)"/>
     </xsl:template>
    </xsl:stylesheet>
    

    在提供的 XML 文档上应用此转换时

    <Seminars>
        <Seminar>
            <Venue P="ABC" dt="20111223"/>
            <Subject name="Finance">
                <Topic main="Bonds"/>
                <Topic main="Stocks" sub="Technical Analysis"/>
            </Subject>
        </Seminar>
        <Seminar>
            <Venue P="ABC" dt="20111225"/>
            <Subject name="Yoga">
                <Topic main="Benefits"/>
            </Subject>
            <Subject name="Meditation">
                <Topic main="Benefits"/>
            </Subject>
        </Seminar>
        <Seminar>
            <Venue P="PQR" dt="20111220"/>
            <Subject name="IT">
                <Topic main="Java" sub="Swing"/>
                <Topic main="Java" sub="NIO"/>
            </Subject>
        </Seminar>
        <Seminar>
            <Venue P="ABC" dt="20111224"/>
            <Subject name="Medical">
                <Topic main="Plastic Surgery"/>
                <Topic main="Mal-nutrition"/>
            </Subject>
            <Subject name="IT">
                <Topic main="Java" sub="Collections"/>
                <Topic main="Web Technologies"/>
            </Subject>
        </Seminar>
        <Seminar>
            <Venue P="XYZ" dt="20111226"/>
            <Subject name="IT">
                <Topic main="DotNET - I"/>
                <Topic main="DotNET - II"/>
                <Topic main="XML" sub="Security"/>
            </Subject>
        </Seminar>
        <Seminar>
            <Venue P="XYZ" dt="20111227"/>
            <Subject name="IT">
                <Topic main="Oracle"/>
                <Topic main="Oracle" sub="JDeveloper"/>
            </Subject>
        </Seminar>
    </Seminars>
    

    产生所需的正确输出

    Finance
      - Bonds
      - Stocks, Technical Analysis
    Yoga
      - Benefits
    Meditation
      - Benefits
    IT
      - Java, Swing
      - Java, NIO
    Medical
      - Plastic Surgery
      - Mal-nutrition
    IT
      - Java, Collections
      - Web Technologies
    IT
      - DotNET - I
      - DotNET - II
      - XML, Security
    IT
      - Oracle
      - Oracle, JDeveloper
    

    【讨论】:

      猜你喜欢
      • 2023-01-10
      • 2010-09-13
      • 2010-12-31
      • 1970-01-01
      • 2018-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多