java - 解析器在java中解析未知的XML Schema

标签 java xml parsing

我尝试理解 stackoverflow 中的所有其他答案。但我无法将这些答案与我的问题联系起来。

当我调用网络服务时,我得到 response 。我通过 response.getData();(The XML of the data table containing the results.) 获取架构(return type String) 。我们不知道在该 XML 中获得了什么数据。

我需要使用第三方解析器,这样当我将上述字符串提供给该解析器中的一个方法时,它应该返回该 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();
            }

但我不确定 PhoneNumber 是否带有该标签或其他名称。我们也不知道我们有多少标签。

谢谢,使用 SyamS 的代码,我可以从 xml 打印所有节点和相应的值。现在我想将其存储到 HashMap 中,其中键作为节点名称,节点值在列表中。

示例 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>

最佳答案

您无需为此寻求第三方库。您可以简单地使用 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;
}

关于java - 解析器在java中解析未知的XML Schema,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28093837/

相关文章:

java - 如何将字符串解析为 BigDecimal?

android - 不从资源解析布局并在运行时设置它

java - 如何处理不同计算机之间的 Java 2D 性能差异?

java - 无法子类化最终类 com.sun.jmx.mbeanserver.JmxMBeanServer

xml - 如何转换xslt中的日期格式

ios - GDataXML 更新 xml 数据

xml - 解析 Xpath 查询

java - 应用程序陷入僵局

java - 使用 ComponentResizer 时重叠组件

parsing - CLR 解析冲突