我正在尝试使用 SAX 解析 xml 。我想以嵌套方式从xml中获取所有标记及其值。是否可以使用 SAX 解析器。任何人都可以给我一个例子。 (我认为SAX比w3文档构建器有效,所以我选择了它。我想知道天气我在正确的道路上) 我正在附加我的java程序
class MySAXApp extends DefaultHandler
{
public MySAXApp ()
{
super();
}
public void startDocument ()
{
System.out.println("Start document");
}
public void endDocument ()
{
System.out.println("End document");
}
public void startElement (String uri, String name,
String qName, Attributes atts)
{
System.out.println(atts.getLength());
if ("".equals (uri))
System.out.println("Start element: " + qName);
else
System.out.println("Start element: {" + uri + "}" + name);
}
}
这是我的XML。 这是一个有效的xml吗?像这样编写xml是否有任何错误
<?xml version="1.0" encoding="utf-8"?>
<CustomerReport xsi:schemaLocation="Customer.xsd">
<Customer>
<CustomerName>str1234</CustomerName>
<CustomerStatus>str1234</CustomerStatus>
<PurchaceOrders>
<PurchaceOrder>
<PurchaceOrderName>str1234</PurchaceOrderName>
</PurchaceOrder>
</PurchaceOrders>
</Customer>
</CustomerReport>
我是XML的新手。有人可以帮我这个
答案 0 :(得分:1)
当你说SAX更高效&#34;时,你的实际意思是SAX解析器完成最少量的工作,将大部分工作留给应用程序。这意味着您(应用程序编写者)需要编写更多代码,而且正如您所发现的那样,它是非常棘手的代码。因为编写XML解析器的人比你更有经验的Java编码器,所以你在代码中做的工作越多,你在解析器中做的越少,整个应用程序的效率就越低。 。因此,根据您的经验水平,我的建议是使用解析方法,尽可能地让库尽可能地完成工作。我建议使用JDOM2。
答案 1 :(得分:0)
您发布的XML中唯一的属性是带有xsi前缀的属性。其余属性长度应为0。
属性是标记内的键值对。您的大多数xml内容都在元素内部。
SAX(或STAX)与JDOM之类的效率优势是由于sax解析器没有维护它在内存中读取的所有数据。如果您使用contentHandler检索数据并在读取数据时将其保存,那么您的程序就不必消耗那么多内存。
阅读this tutorial或this Javaworld article。您需要实现一个字符方法才能获取任何元素文本。这两篇链接文章都提供了如何实现字符方法的好例子,以便您可以检索元素文本。
如果你在谷歌周围(bad example)或搜索stackoverflow(bad example here),你可能会发现很多不好的例子,但链接文章中的示例实现是更正,因为它们缓冲了字符方法的输出,直到找到所有字符:
解析器不需要一次返回任何特定数量的字符。解析器可以一次从单个字符返回任何内容,但仍然是符合标准的实现。因此,如果您的应用程序需要处理它看到的字符,那么使用characters()方法在java.lang.StringBuffer中累积字符并且只有在您确定已找到所有字符时才对它们进行操作是明智的。 / p>
以下是来自JavaWorld文章的HelloHandler的hello world示例已更改为使用您的xml:
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import java.io.*;
public class Example2 extends DefaultHandler {
// Local variables to store data
// found in the XML document
public String name = "";
public String status = "";
public String orderName = ""
// Buffer for collecting data from // the "characters" SAX event.
private CharArrayWriter contents = new CharArrayWriter();
// Override methods of the DefaultHandler class
// to gain notification of SAX Events.
//
// See org.xml.sax.ContentHandler for all available events.
//
public void startElement( String namespaceURI,
String localName,
String qName,
Attributes attr ) throws SAXException {
contents.reset();
}
public void endElement( String namespaceURI,
String localName,
String qName ) throws SAXException {
if ( localName.equals( "CustomerName" ) ) {
name = contents.toString();
}
if ( localName.equals( "CustomerStatus" ) ) {
status = contents.toString();
}
if (localName.equals("PurchaceOrderName")) {
orderName = contents.toString();
}
}
public void characters( char[] ch, int start, int length )
throws SAXException {
contents.write( ch, start, length );
}
}