gpt4 book ai didi

java - 如何使用 SAX 解析器处理 namespace ?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:58:58 25 4
gpt4 key购买 nike

我正在尝试学习解析 XML 文档,我有一个使用 namespace 的 XML 文档,所以我确定我需要做一些事情才能正确解析。

这是我的:

DefaultHandler handler = new DefaultHandler() {

boolean bfname = false;
boolean blname = false;
boolean bnname = false;
boolean bsalary = false;

public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {

System.out.println("Start Element :" + qName);

if (qName.equalsIgnoreCase("FIRSTNAME")) {
bfname = true;
}

if (qName.equalsIgnoreCase("LASTNAME")) {
blname = true;
}

if (qName.equalsIgnoreCase("NICKNAME")) {
bnname = true;
}

if (qName.equalsIgnoreCase("SALARY")) {
bsalary = true;
}

}

public void endElement(String uri, String localName,
String qName) throws SAXException {

System.out.println("End Element :" + qName);

}

public void characters(char ch[], int start, int length) throws SAXException {

if (bfname) {
System.out.println("First Name : " + new String(ch, start, length));
bfname = false;
}

if (blname) {
System.out.println("Last Name : " + new String(ch, start, length));
blname = false;
}

if (bnname) {
System.out.println("Nick Name : " + new String(ch, start, length));
bnname = false;
}

if (bsalary) {
System.out.println("Salary : " + new String(ch, start, length));
bsalary = false;
}

}

};

saxParser.parse(file, handler);

我的问题是,我该如何处理这个例子中的命名空间?

最佳答案

详细说明什么Blaise's point使用示例代码,考虑这个人为的例子:

<?xml version="1.0" encoding="UTF-8"?>
<!-- ns.xml -->
<root xmlns:foo="http://data" xmlns="http://data">
<foo:record>ONE</foo:record>
<bar:record xmlns:bar="http://data">TWO</bar:record>
<record>THREE</record>
<record xmlns="http://metadata">meta 1</record>
<foo:record xmlns:foo="http://metadata">meta 2</foo:record>
</root>

有两种不同类型的record 元素。 http://data 命名空间中的一个;另一个在 http://metadata 命名空间中。共有三个数据记录和两个元数据记录。

文档可以规范化为:

<?xml version="1.0" encoding="UTF-8"?>
<ns0:root xmlns:ns0="http://data" xmlns:ns1="http://metadata">
<ns0:record>ONE</ns0:record>
<ns0:record>TWO</ns0:record>
<ns0:record>THREE</ns0:record>
<ns1:record>meta 1</ns1:record>
<ns1:record>meta 2</ns1:record>
</ns0:root>

但代码必须处理一般情况。

下面是打印元数据记录的一些代码:

class MetadataPrinter extends DefaultHandler {
private boolean isMeta = false;

@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
isMeta = "http://metadata".equals(uri) && "record".equals(localName);
}

@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if (isMeta) {
System.out.println();
isMeta = false;
}
}

@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if (isMeta) {
System.out.print(new String(ch, start, length));
}
}
}

SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
SAXParser parser = factory.newSAXParser();
parser.parse(new File("ns.xml"), new MetadataPrinter());

注意:必须在一些较旧的 Java XML API(其中包括 SAX 和 DOM)中显式启用 namespace 感知。

关于java - 如何使用 SAX 解析器处理 namespace ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21807530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com