我创建了一个Java应用程序,它打开一个看起来像这样的xml文件:
<AnimalTree>
<animal>
<mammal>canine</mammal>
<color>blue</color>
</animal>
<!-- ... -->
</AnimalTree>
Run Code Online (Sandbox Code Playgroud)
我可以用以下方式打开它:
File fXmlFile = getResources.getXml("res/xml/data.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
NodeList animalNodes = doc.getElementsByTagName("animal");
Run Code Online (Sandbox Code Playgroud)
然后我可以简单地创建一个节点,将对象推送到ListArray中,然后在循环ListArray时执行我想要的对象.
for (int temp = 0; temp < animalNodes.getLength(); temp++) {
Node nNode = animalNodes.item(temp);
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
question thisAnimal = new animal();
thisAnimal.mammal = getTagValue("mammal",eElement);
// ...
Run Code Online (Sandbox Code Playgroud)
干净利落!现在只在Android中我不能简单地读取文件" res/xml/data.xml",因为" File();"需要一个String不是integer(id).这是我迷失的地方.有没有办法可以" File();"打开文件,或者如果不使用SAXparser或者这是不可能的 …
下面两个片段有什么区别,如果我只需要解析XML?
1.使用SAXParser parse方法:
SAXParserFactory sfactory = SAXParserFactory.newInstance();
SAXParser parser = sfactory.newSAXParser();
parser.parse(new File(filename), new DocHandler());
Run Code Online (Sandbox Code Playgroud)
现在使用parse从SAXParser获取的XMLReader 方法
SAXParserFactory sfactory = SAXParserFactory.newInstance();
SAXParser parser = sfactory.newSAXParser();
XMLReader xmlparser = parser.getXMLReader();
xmlparser.setContentHandler(new DocHandler());
xmlparser.parse(new InputSource("test1.xml"));
Run Code Online (Sandbox Code Playgroud)
尽管获得了更大的灵活性,还有其他区别吗?
我正在将代码从应用程序的一部分(applet)复制到应用程序内部.我正在将XML解析为String.自从我解析XML以来已经有一段时间了,但是从抛出的错误看起来它可能与找不到.dtd有关.堆栈跟踪使得很难找到错误的确切原因,但这里是消息:
java.net.MalformedURLException: no protocol: <a href="http://www.mycomp.com/MyComp.dtd">http://www.mycomp.com/MyComp.dtd</a>
Run Code Online (Sandbox Code Playgroud)
并且XML将此作为第一对行:
<?xml version='1.0'?>
<!DOCTYPE MYTHING SYSTEM '<a href="http://www.mycomp.com/MyComp.dtd">http://www.mycomp.com/MyComp.dtd</a>'>
Run Code Online (Sandbox Code Playgroud)
这是相关的代码片段
class XMLImportParser extends DefaultHandler {
private SAXParser m_SaxParser = null;
private String is_InputString = "";
XMLImportParser(String xmlStr) throws SAXException, IOException {
super();
is_InputString = xmlStr;
createParser();
try {
preparseString();
parseString(is_InputString);
} catch (Exception e) {
throw new SAXException(e); //"Import Error : "+e.getMessage());
}
}
void createParser() throws SAXException {
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
try {
factory.setFeature("http://xml.org/sax/features/namespaces", true);
factory.setFeature("http://xml.org/sax/features/namespace-prefixes", true);
m_SaxParser = factory.newSAXParser();
m_SaxParser.getXMLReader().setFeature("http://xml.org/sax/features/namespaces", true); …Run Code Online (Sandbox Code Playgroud) 我有以下java代码,我需要在C#中转换这些,请帮助我..
public class Configuration {
private ConfigContentHandler confHandler;
public Configuration() {
}
public boolean parseConfigFile() throws Exception {
boolean bReturn = true;
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
System.out.println("*** Start parsing");
try {
confHandler = new ConfigContentHandler(100);
// Configuration file must be located in main jar file folder
// Set the full Prosper file name
String sConfigFile = "configuration.xml";
// Get abstract (system independent) filename
File fFile = new File(sConfigFile);
if (!fFile.exists()) {
System.out.println("Could not find configuration file " + sConfigFile + …Run Code Online (Sandbox Code Playgroud) 是否可以在SAX解析器中提供路径表达式?我有一个XML文件,它有几个相同的名称标签,但它们在不同的元素中.有没有办法区分它们.这是XML:
<Schools>
<School>
<ID>335823</ID>
<Name>Fairfax High School</Name>
<Student>
<ID>4195653</ID>
<Name>Will Turner</Name>
</Student>
<Student>
<ID>4195654</ID>
<Name>Bruce Paltrow</Name>
</Student>
<Student>
<ID>4195655</ID>
<Name>Santosh Gowswami</Name>
</Student>
</School>
<School>
<ID>335824</ID>
<Name>FallsChurch High School</Name>
<Student>
<ID>4153</ID>
<Name>John Singer</Name>
</Student>
<Student>
<ID>4154</ID>
<Name>Shane Warne</Name>
</Student>
<Student>
<ID>4155</ID>
<Name>Eddie Diaz</Name>
</Student>
</School>
</Schools>
Run Code Online (Sandbox Code Playgroud)
我想根据学校的名称和ID区分学生的姓名和身份证.
谢谢你的回复:
我创建了一个学生pojo,其中包含以下字段:school_id,school_name,student_id和student_name以及getter和setter方法.这是我的临时解析器实现.当我解析xml时,我需要将学校名称,id,学生姓名,id的值放在pojo中并返回它.你能告诉我如何实现堆栈以区分.这是我的解析器框架::
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class HandleXML extends DefaultHandler {
private student info;
private boolean school_id = false;
private boolean school_name = false;
private boolean student_id = false;
private boolean …Run Code Online (Sandbox Code Playgroud) 我正在开发一个应用程序,其中第一次我要解析来自远程服务器的xml文件中的数据.
但我无法选择哪种解析器有效或最适合解析.由于主要有三种类型的解析,我知道:
哪个是解析数据的最佳解析器?当我在Google上搜索并发现上述解析器的正反两面时.但我无法确定哪种效率最高.
XML具有大量标签的大量数据.
请指导我并建议我应该使用哪个解析器,因为我在我的应用程序中第一次使用解析.
是否可以从startElement函数中获取元素的内容,该函数是SAX处理程序的覆盖函数?
以下是规格.
1)XML文件
<employees>
<employee id="111">
<firstName>Rakesh</firstName>
<lastName>Mishra</lastName>
<location>Bangalore</location>
</employee>
<employee id="112">
<firstName>John</firstName>
<lastName>Davis</lastName>
<location>Chennai</location>
</employee>
<employee id="113">
<firstName>Rajesh</firstName>
<lastName>Sharma</lastName>
<location>Pune</location>
</employee>
</employees>
Run Code Online (Sandbox Code Playgroud)
2)startElement功能
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
.......code in here..........
}
Run Code Online (Sandbox Code Playgroud)
3)预期结果
element name : employee
attribute name : id
attribute value: 111
firstName : Rakesh
lastName : Mishra
location : Bangalore
element name : employee
attribute name : id
attribute value: 112
firstName : …Run Code Online (Sandbox Code Playgroud) 我的xml文件结构是这样的
<?xml version="1.0" encoding="utf-8" ?>
<book>
<chapters>
<chapter id="1">
<page id="1" cid= "1" bid = "Book1">
<text>Hi</text>
</page>
<page id="2" cid= "1" bid = "Book1">
<text>Hi</text>
</page>
</chapter>
<chapter id="2">
<page id="1" cid= "2" bid = "Book1">
<text>Hi</text>
</page>
<page id="2" cid= "2" bid = "Book1">
<text>Hi</text>
</page>
</chapter>
<chapter id="3">
<page id="1" cid= "3" bid = "Book1">
<text>Hi</text>
</page>
<page id="2" cid= "3" bid = "Book1">
<text>Hi</text>
</page>
</chapter>
</chapters>
</book>
Run Code Online (Sandbox Code Playgroud)
我希望通过传递页面ID和章节ID来获取特定的页面节点.我怎样才能做到这一点?
此外,书籍节点包含太多章节,每章包含许多页面.所以,我正在使用SAX解析器来解析内容.
我正在制作一个读取XML Internet的Android应用程序.此应用程序使用SAX来解析XML.这是我解析部分的代码:
public LectorSAX(String url){
try{
SAXParserFactory spf=SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
DefaultHandler lxmlr=new LibraryXMLReader() ;
sp.parse(url, lxmlr);
nodo=((LibraryXMLReader)lxmlr).getNodoActual();
}catch(ParserConfigurationException e){
System.err.println("Error de parseo en LectorSAX.java: "+e);
}catch(SAXException e){
System.err.println("Error de sax LectorSAX.java: " + e);
} catch (IOException e){
System.err.println("Error de io LectorSAX.java: " + e);
}
}
Run Code Online (Sandbox Code Playgroud)
问题是SAXException发生.异常消息如下:
org.apache.harmony.xml.ExpatParser $ ParseException:在第4行,第42列:格式不正确(无效令牌)
但是,如果我将相同的代码放在普通的Java SE应用程序中,则不会发生此异常,一切正常.
为什么相同的代码在Java SE应用程序中运行良好,而不是Android?另一方面,如何解决问题?
谢谢您的帮助.
问候.
我正在尝试读取基于xml的文件格式,并在JAVA中使用SAX称为mzXML.它携带部分编码的质谱数据(具有强度的信号).
这就是感兴趣的条目看起来像(有更多的信息):
<peaks ... >eJwBgAN//EByACzkZJkHP/NlAceAXLJAckeQ4CIUJz/203q2...</peaks>
Run Code Online (Sandbox Code Playgroud)
可以在此处下载一个强制错误的完整文件.
其中一个条目中的String包含大约500个压缩和base64编码的双精度对(信号和强度).我所做的是解压缩和解码,以获取值(解码未在下面的示例中显示).这对小型数据集来说都很好.现在我使用了更大的一个,我遇到了一个我不理解的问题:
过程字符(ch,start,length)不会读取之前显示的行中的完整条目.该长度值似乎是小.
当我刚刚将峰值条目打印到控制台时,我没有看到这个问题,因为有很多字母而且我没有意识到字母丢失了.但是当缺少信息时,减压失败了.当我重复运行这个程序时,它总是在同一点打破同一行而不给出任何异常.如果我通过删除扫描来更改mzXML文件,它会在不同的位置中断.我在character()过程中使用断点查看currentValue的内容时发现了这一点
以下是概括问题所需的一段代码:
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.DataFormatException;
import java.util.zip.Inflater;
import javax.xml.bind.DatatypeConverter;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class ReadXMLFile {
public static byte[] decompress(byte[] data) throws IOException, DataFormatException {
Inflater inflater = new Inflater();
inflater.setInput(data);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length);
byte[] buffer = new byte[data.length*2];
while (!inflater.finished()) {
int count = inflater.inflate(buffer);
outputStream.write(buffer, 0, count);
} …Run Code Online (Sandbox Code Playgroud)