用于解析 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;
}