如何使用Java浏览和显示XML内容

时间:2012-11-29 00:28:00

标签: java html xml dom sax

我在Java中遇到DOM问题... 这是XML代码:

<?xml version="1.0" encoding="UTF-8"?>
<bib>
<domain>
    <title>Specifications</title>
    <bib_ref>
        <year>March 2000</year>
        <title>MOF  1.3</title>
        <author>OMG</author>
        <weblink>D:\SALIM\Docs\Specifications\MOF1_3.pdf</weblink>
    </bib_ref>
    <bib_ref>
        <year>August 2002</year>
        <title>IDLto Java LanguageMapping Specification</title>
        <author>OMG</author>
        <weblink>D:\SALIM\Docs\Specifications\IDL2Java.pdf</weblink>
    </bib_ref>
    <bib_ref>
        <year>1999</year>
        <title>XML Metadata Interchange (XMI) Version 1.1</title>
        <author>OMG</author>
        <weblink>D:\SALIM\Docs\Specifications\xmi-1.1.pdf</weblink>
    </bib_ref>
    <bib_ref>
        <year>2002</year>
        <title>XML Metadata Interchange (XMI) Version 2</title>
        <author>"OMG</author>
        <weblink>D:\SALIM\Docs\Specifications\XMI2.pdf</weblink>
    </bib_ref>
    <bib_ref>
        <year>2002</year>
        <title>XMI Version 1Production of XML Schema Specification</title>
        <author>OMG</author>
        <weblink>D:\SALIM\Docs\Specifications\XMI1XSD.pdf</weblink>
    </bib_ref>
    <bib_ref>
        <year>2002</year>
        <title>EDOC</title>
        <author>OMG</author>
        <weblink>D:\SALIM\Docs\Specifications\EDOC02-02-05.pdf</weblink>
    </bib_ref>
</domain>
<domain>
    <title>Theses</title>
    <bib_ref>
        <year>Octobre 2001</year>
        <title>Echanges de Spécifications Hétérogènes et Réparties</title>
        <author>Xavier Blanc</author>
        <weblink>D:\SALIM\Docs\Theses\TheseXavier.pdf</weblink>
    </bib_ref>
    <bib_ref>
        <year>Janvier 2001</year>
        <title>Composition of Object-Oriented Software Design Models</title>
        <author>Siobhan Clarke</author>
        <weblink>D:\SALIM\Docs\Theses\SClarkeThesis.pdf</weblink>
    </bib_ref>
 ......
 ......

之后,在Java main函数中,我调用了恰好存在的dispContent函数:

public void dispContent (Node n) 
{

    String domainName = null;

    // we are in an element node
    if (n instanceof Element) {
        Element e = ((Element) n);

        // domain title
        if (e.getTagName().equals("title") && e.getParentNode().getNodeName().equals("domain")) {
            domainName = e.getTextContent();
            DomaineTemplate(domainName);
        }

        else if (e.getTagName().equals("bib_ref")) {
            NodeList ref = e.getChildNodes();

            for (int i = 0; i < ref.getLength(); i++) {
                Node temp = (Node) ref.item(i);

                if (temp.getNodeType() == Node.ELEMENT_NODE) {
                    if (temp.getNodeType() == org.w3c.dom.Node.TEXT_NODE)
                        continue;

                    out.println(temp.getNodeName() + " : " + temp.getTextContent() + "\n");
                }
            }
        }

        else {
            NodeList sub = n.getChildNodes();
            for(int i=0; (i < sub.getLength()); i++)
                dispContent(sub.item(i));

        }
    }
        /*else if (n instanceof Document) {
        NodeList fils = n.getChildNodes();
        for(int i=0; (i < fils.getLength()); i++) {
            dispContent(fils.item(i));

        }
    }*/
}

“domaineTemplate”函数只显示其参数! 当我在Java中浏览“bib_ref”标签时,我的问题就出现了。对于每个“bib_ref”循环,它显示所有“bib_ref”标签的所有内容......在一行中!我想每个“bib_ref”只显示一个内容(年份,标题,作者和网络链接标记)。

以下是我浏览bib_ref时显示的内容:

  

规格

     

年:2000年3月标题:MOF 1.3作者:OMG weblink:D:\ SALIM \ Docs \ Specifications \ MOF1_3.pdf年份:2002年8月标题:IDLto Java LanguageMapping规范作者:OMG weblink:D:\ SALIM \ Docs \规范\ IDL2Java.pdf年份:1999标题:XML元数据交换(XMI)版本1.1作者:OMG weblink:D:\ SALIM \ Docs \ Specifications \ xmi-1.1.pdf年份:2002标题:XML元数据交换(XMI)版本2作者:OMG weblink:D:\ SALIM \ Docs \ Specifications \ XMI2.pdf年份:2002标题:XMI版本1 XML Schema规范生成作者:OMG weblink:D:\ SALIM \ Docs \ Specifications \ XMI1XSD.pdf年份:2002标题:EDOC作者:OMG weblink:D:\ SALIM \ Docs \ Specifications \ EDOC02-02-05.pdf

     

论文

     

year:Octobre 2001 title:Echanges deSp cificationsH t rog nesetR parties作者:Xavier Blanc网站链接:D:\ SALIM \ Docs \ Theses \ TheseXavier.pdf年:Janvier 2001标题:作文面向对象的软件设计模型作者:Siobhan Clarke weblink:D:\ SALIM \ Docs \ Theses \ SClarkeThesis.pdf年:Juin 2002标题:贡献 larepr sentationde processu par des techniquesdem tamod lisationauthor :Erwan Breton网站链接:D:\ SALIM \ Docs \ Theses \ ErwanBretonThesis.pdf年:Octobre 2000标题:技术deMod lisationetdeM tamod lisation作者:Richard Lemesle网站链接:D:\ SALIM \ Docs \ Theses \ RichardLemesle.pdf年:Juillet 2002年头衔:Utilsation d'agents mobiles pour la construction des servicesdistribu s作者:Siegfried Rouvrais weblink:D:\ SALIM \ Docs \ Theses \ theserouvrais.pdf   ...   ...

你能帮帮我吗? 我只是一个带java的xml初学者,我正在寻找一些解决方案大约3个小时...非常感谢!

2 个答案:

答案 0 :(得分:4)

我调用了dispContent(doc.getFirstChild());,其中doc是带有给定xml文件内容的Document。

假设:out.println()System.out.println()DomaineTemplate(domainName);添加换行符(根据您提供的输出)

我在控制台中打印出以下内容:

Specifications

year : March 2000

title : MOF  1.3

author : OMG

weblink : D:\SALIM\Docs\Specifications\MOF1_3.pdf

year : August 2002

title : IDLto Java LanguageMapping Specification

author : OMG

weblink : D:\SALIM\Docs\Specifications\IDL2Java.pdf

year : 1999

title : XML Metadata Interchange (XMI) Version 1.1

author : OMG

weblink : D:\SALIM\Docs\Specifications\xmi-1.1.pdf

year : 2002

title : XML Metadata Interchange (XMI) Version 2

author : "OMG

weblink : D:\SALIM\Docs\Specifications\XMI2.pdf

year : 2002

title : XMI Version 1Production of XML Schema Specification

author : OMG

weblink : D:\SALIM\Docs\Specifications\XMI1XSD.pdf

year : 2002

title : EDOC

author : OMG

weblink : D:\SALIM\Docs\Specifications\EDOC02-02-05.pdf

Theses

year : Octobre 2001

title : Echanges de Spécifications Hétérogènes et Réparties

author : Xavier Blanc

weblink : D:\SALIM\Docs\Theses\TheseXavier.pdf

year : Janvier 2001

title : Composition of Object-Oriented Software Design Models

author : Siobhan Clarke

weblink : D:\SALIM\Docs\Theses\SClarkeThesis.pdf

如果您在"\n"创建新行时出现问题,可以尝试使用系统使用的内容:

public static final String NEW_LINE = System.getProperty("line.separator");

如果您不希望“bib_ref”节点的子节点打印输出的每一行之间有新行,请更改:

else if (e.getTagName().equals("bib_ref")) {
    NodeList ref = e.getChildNodes();

        for (int i = 0; i < ref.getLength(); i++) {
            Node temp = (Node) ref.item(i);

            if (temp.getNodeType() == Node.ELEMENT_NODE) {
                if (temp.getNodeType() == org.w3c.dom.Node.TEXT_NODE)
                    continue;

                 out.println(temp.getNodeName() + " : " + temp.getTextContent() + "\n");
            }
        }
}

为:

else if (e.getTagName().equals("bib_ref")) {
    NodeList ref = e.getChildNodes();

        for (int i = 0; i < ref.getLength(); i++) {
            Node temp = (Node) ref.item(i);

            if (temp.getNodeType() == Node.ELEMENT_NODE) {
                if (temp.getNodeType() == org.w3c.dom.Node.TEXT_NODE)
                    continue;

                 // Removed "\n":
                 out.println(temp.getNodeName() + " : " + temp.getTextContent());
            }
        }

        // Added out.println();
        out.println();
}

结果:

Specifications

year : March 2000
title : MOF  1.3
author : OMG
weblink : D:\SALIM\Docs\Specifications\MOF1_3.pdf

year : August 2002
title : IDLto Java LanguageMapping Specification
author : OMG
weblink : D:\SALIM\Docs\Specifications\IDL2Java.pdf

year : 1999
title : XML Metadata Interchange (XMI) Version 1.1
author : OMG
weblink : D:\SALIM\Docs\Specifications\xmi-1.1.pdf

year : 2002
title : XML Metadata Interchange (XMI) Version 2
author : "OMG
weblink : D:\SALIM\Docs\Specifications\XMI2.pdf

year : 2002
title : XMI Version 1Production of XML Schema Specification
author : OMG
weblink : D:\SALIM\Docs\Specifications\XMI1XSD.pdf

year : 2002
title : EDOC
author : OMG
weblink : D:\SALIM\Docs\Specifications\EDOC02-02-05.pdf

Theses

year : Octobre 2001
title : Echanges de Spécifications Hétérogènes et Réparties 
author : Xavier Blanc
weblink : D:\SALIM\Docs\Theses\TheseXavier.pdf

year : Janvier 2001
title : Composition of Object-Oriented Software Design Models
author : Siobhan Clarke
weblink : D:\SALIM\Docs\Theses\SClarkeThesis.pdf

答案 1 :(得分:1)

当然,现在我看到你用html标记了你的问题,你的代码到目前为止与html无关。所以我认为out.println是Servlet的一些OutputStream,你正在尝试输出html。

因此,println换行符和“\ n”换行符仅在html源代码中可用。浏览器将跳过此内容。

更改此行

  

out.println(temp.getNodeName()+“:”+ temp.getTextContent()+   “\ n”);

  

out.println(temp.getNodeName()+“:”+ temp.getTextContent()+“&lt; br   /&gt;“中);

并且servlet应该与换行符一起正常输出。