用于解析 java 中未知 XML 架构的解析器
Parser to parse unknown XML Schema in java
我尝试理解 Whosebug.But 中的所有其他答案,但我无法将这些答案与我的问题联系起来。
当我调用网络服务时,我得到 response
。我通过 response.getData();(The XML of the data table containing the results.)
(return type String)
获取架构。我们不知道我们在 XML 中得到了什么数据。
我需要使用第 3 方解析器,这样当我将上述字符串提供给该解析器中的一个方法时,它应该 return 中的所有元素 XML 然后我可以打印所需的元素。
我不想自己开始解析 XML。有什么办法可以做到这一点? (它甚至有意义吗?)。对不起,如果我完全错了。 (使用 Axis2/eclipse
)(已编辑)
编辑:添加我已经尝试过的代码。
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
NodeList nodeList = null;
try {
String xml = res2.getResult().getRawData();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(new ByteArrayInputStream(xml.getBytes()));
nodeList = document.getElementsByTagName("PhoneNumber");
NamedNodeMap attrib = document.getAttributes();
for (int i = 0; i < attrib.getLength(); i++) {
String nodeName = attrib.item(i).getNodeName();
//nodeName
String nodeValue = attrib.item(i).getNodeValue();
}
但我不确定电话号码是否带有该标签或其他名称。我们也不知道我们有多少标签。
谢谢,使用 SyamS 的代码,我能够打印 xml 中的所有节点和相应的值。现在我想将其存储到哈希图中,键作为节点名称和列表中的节点值。
示例XML:
<Docs>
<Doc>
<Id>12</Id>
<Phone>1234</Phone>
</Doc>
<Doc>
<Id>147</Id>
<Phone>12345</Phone>
<Locked>false</Locked>
<BID>2</BID>
<DocId>8</DocId>
<Date>2014-02-04T12:18:50.063-07:00</Date>
<Urgent>false</Urgent>
</Doc>
</Docs>
您应该阅读与 Best XML parser for Java. Using the example XML from Sample XML File (books.xml) 相关的答案,我已将其下载到我的 C: 驱动器上的临时文件夹中,您可以使用 Java 的本机 SAXParser 库。下面是一个示例 class,您可以使用它来遍历 XML 中的所有元素。在您的项目中创建 class,并将其解析方法调用为:
File xml = new File("c:/temp/books.xml");
MySaxParser sax = new MySaxParser(xml);
sax.parseXml();
这是 class 您可以将其复制到您的项目中进行试用。当然,根据您的需要进行修改。导入应将您引导至适当的 Java API 页面,例如 Class SAXParser 开头。
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
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 MySaxParser extends DefaultHandler {
private String absolutePathToXml = "";
public MySaxParser(File xml) {
absolutePathToXml = xml.getAbsolutePath();
}
/**
* Parses an XML file into memory
*/
public void parseXml() {
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
SAXParser parser = factory.newSAXParser();
parser.parse(absolutePathToXml, this);
} catch (ParserConfigurationException e) {
System.out.println("ParserConfigurationException: ");
e.printStackTrace();
} catch (SAXException e) {
System.out.println("SAXException: ");
e.printStackTrace();
} catch (IOException e) {
System.out.println("IOException: ");
e.printStackTrace();
}
}
/**
* Event: Parser starts reading an element
*/
@Override
public void startElement(String s1, String s2, String elementName, Attributes attributes)
throws SAXException {
//print an element's name
System.out.println("element: " + elementName);
//print all attributes for this element
for(int i = 0; i < attributes.getLength(); i++) {
System.out.println("attribute: " + attributes.getValue(i));
}
}
}
你不需要为此去第三方图书馆。您可以简单地使用 xpath 识别所有叶节点并读取值(以及属性)。例如
public static Map<String, List<String>> parseXml(String xml) throws XMLStreamException {
StringBuilder content = null;
Map<String, List<String>> dataMap = new HashMap<>();
XMLInputFactory factory = XMLInputFactory.newInstance();
InputStream stream = new ByteArrayInputStream(xml.getBytes());
XMLStreamReader reader = factory.createXMLStreamReader(stream);
while (reader.hasNext()) {
int event = reader.next();
switch (event) {
case XMLStreamConstants.START_ELEMENT:
content = new StringBuilder();
break;
case XMLStreamConstants.CHARACTERS:
if (content != null) {
content.append(reader.getText().trim());
}
break;
case XMLStreamConstants.END_ELEMENT:
if (content != null) {
String leafText = content.toString();
if(dataMap.get(reader.getLocalName()) == null){
List<String> values = new ArrayList<>();
values.add(leafText);
dataMap.put(reader.getLocalName(), values);
} else {
dataMap.get(reader.getLocalName()).add(leafText);
}
}
content = null;
break;
case XMLStreamConstants.START_DOCUMENT:
break;
}
}
return dataMap;
}
我尝试理解 Whosebug.But 中的所有其他答案,但我无法将这些答案与我的问题联系起来。
当我调用网络服务时,我得到 response
。我通过 response.getData();(The XML of the data table containing the results.)
(return type String)
获取架构。我们不知道我们在 XML 中得到了什么数据。
我需要使用第 3 方解析器,这样当我将上述字符串提供给该解析器中的一个方法时,它应该 return 中的所有元素 XML 然后我可以打印所需的元素。
我不想自己开始解析 XML。有什么办法可以做到这一点? (它甚至有意义吗?)。对不起,如果我完全错了。 (使用 Axis2/eclipse
)(已编辑)
编辑:添加我已经尝试过的代码。
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
NodeList nodeList = null;
try {
String xml = res2.getResult().getRawData();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(new ByteArrayInputStream(xml.getBytes()));
nodeList = document.getElementsByTagName("PhoneNumber");
NamedNodeMap attrib = document.getAttributes();
for (int i = 0; i < attrib.getLength(); i++) {
String nodeName = attrib.item(i).getNodeName();
//nodeName
String nodeValue = attrib.item(i).getNodeValue();
}
但我不确定电话号码是否带有该标签或其他名称。我们也不知道我们有多少标签。
谢谢,使用 SyamS 的代码,我能够打印 xml 中的所有节点和相应的值。现在我想将其存储到哈希图中,键作为节点名称和列表中的节点值。
示例XML:
<Docs>
<Doc>
<Id>12</Id>
<Phone>1234</Phone>
</Doc>
<Doc>
<Id>147</Id>
<Phone>12345</Phone>
<Locked>false</Locked>
<BID>2</BID>
<DocId>8</DocId>
<Date>2014-02-04T12:18:50.063-07:00</Date>
<Urgent>false</Urgent>
</Doc>
</Docs>
您应该阅读与 Best XML parser for Java. Using the example XML from Sample XML File (books.xml) 相关的答案,我已将其下载到我的 C: 驱动器上的临时文件夹中,您可以使用 Java 的本机 SAXParser 库。下面是一个示例 class,您可以使用它来遍历 XML 中的所有元素。在您的项目中创建 class,并将其解析方法调用为:
File xml = new File("c:/temp/books.xml");
MySaxParser sax = new MySaxParser(xml);
sax.parseXml();
这是 class 您可以将其复制到您的项目中进行试用。当然,根据您的需要进行修改。导入应将您引导至适当的 Java API 页面,例如 Class SAXParser 开头。
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
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 MySaxParser extends DefaultHandler {
private String absolutePathToXml = "";
public MySaxParser(File xml) {
absolutePathToXml = xml.getAbsolutePath();
}
/**
* Parses an XML file into memory
*/
public void parseXml() {
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
SAXParser parser = factory.newSAXParser();
parser.parse(absolutePathToXml, this);
} catch (ParserConfigurationException e) {
System.out.println("ParserConfigurationException: ");
e.printStackTrace();
} catch (SAXException e) {
System.out.println("SAXException: ");
e.printStackTrace();
} catch (IOException e) {
System.out.println("IOException: ");
e.printStackTrace();
}
}
/**
* Event: Parser starts reading an element
*/
@Override
public void startElement(String s1, String s2, String elementName, Attributes attributes)
throws SAXException {
//print an element's name
System.out.println("element: " + elementName);
//print all attributes for this element
for(int i = 0; i < attributes.getLength(); i++) {
System.out.println("attribute: " + attributes.getValue(i));
}
}
}
你不需要为此去第三方图书馆。您可以简单地使用 xpath 识别所有叶节点并读取值(以及属性)。例如
public static Map<String, List<String>> parseXml(String xml) throws XMLStreamException {
StringBuilder content = null;
Map<String, List<String>> dataMap = new HashMap<>();
XMLInputFactory factory = XMLInputFactory.newInstance();
InputStream stream = new ByteArrayInputStream(xml.getBytes());
XMLStreamReader reader = factory.createXMLStreamReader(stream);
while (reader.hasNext()) {
int event = reader.next();
switch (event) {
case XMLStreamConstants.START_ELEMENT:
content = new StringBuilder();
break;
case XMLStreamConstants.CHARACTERS:
if (content != null) {
content.append(reader.getText().trim());
}
break;
case XMLStreamConstants.END_ELEMENT:
if (content != null) {
String leafText = content.toString();
if(dataMap.get(reader.getLocalName()) == null){
List<String> values = new ArrayList<>();
values.add(leafText);
dataMap.put(reader.getLocalName(), values);
} else {
dataMap.get(reader.getLocalName()).add(leafText);
}
}
content = null;
break;
case XMLStreamConstants.START_DOCUMENT:
break;
}
}
return dataMap;
}