Java:在不使用 QName 的情况下读取具有动态添加元素的 xml 文件

标签 java xml

我有一个 xml 文件,包含动态生成的标签,如下所示,

<ABC>
    <XYZ>
        <PQR DURI="http://try.org/claims">
            <LMN>
                <URI>http://yyyy/givenname</ClaimURI>
                <DName>First Name</DisplayName>
                <FoundationName>givenName</FoundationName>
                <Description>First Name</Description>
                <Required />
                <DisplayOrder>1</DisplayOrder>
                <SuppDefault />
            </LMN>
            <LMN>
                <CURI>http://kkkk/nickname</ClaimURI>
                <DisplayN>Nick Name</DisplayName>
                <AttributeID>nickName</AttributeID>
                <SDA>23edded<SDA>
                <Description>Nick Name</Description>
                <Required />
                <DisplayOrder>2</DisplayOrder>
                <TransitNumber>89393</TransitNumber>
            </LMN>
         </PQR>
     </XYZ>
</ABC>

我想读取上面的 xml 格式并将它们添加到 Map<String,String>作为键/值对,分别是标签名称和值。我不知道 <LMN> 之间的标签名称标签,因为它们是动态添加的。有没有可能的方法来做到这一点。

我尝试使用以下代码,

  Root = element.getFirstChildWithName(new QName(XYZ)
        OMElement IteratorOne = Root.getChildrenWithLocalName(PQR)
        Iterator<OMElement> IteratorTwo = dialect.getChildrenWithLocalName(LMN);
        while (IteratorTwo.hasNext()) {
            Element = IteratorTwo.next();
            Iterator iterator = Element.getChildren();
            while (iterator.hasNext()) {
                iterator.next();
            }
        }

最佳答案

我有人为其中一项工作做了这个。我使用了 dom 解析器来做到这一点。这是我稍微修改了一下以适合您的使用的代码摘录。我假设代码中 myString 包含您的 XML 文本。如果您有可用的流,则可以直接在 dBuilder 中使用它。

        InputStream is = new ByteArrayInputStream(myString.getBytes());

        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(is);
        doc.getDocumentElement().normalize();

        NodeList nList = doc.getElementsByTagName("LMN");

        for (int temp = 0; temp < nList.getLength(); temp++) {
            Node nNode = nList.item(temp);
            Map<String, String> map = new HashMap<String, String>();
            convertNodeToMap(nNode, map);
        }

这是convertNodeToMap的代码

public static void convertNodeToMap(Node node, Map<String, String> map) {
    if (node != null) {
        if (node.hasChildNodes()) {
            NodeList list = node.getChildNodes();
            for (int count = 0; count < list.getLength(); count++) {
                map.put(list.item(count).getNodeName(), list.item(count).getTextContent());
            }
        } 
    }
}

如果输入文档大小相对较大,您必须意识到 DOM 解析可能会变慢。

关于Java:在不使用 QName 的情况下读取具有动态添加元素的 xml 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31006931/

相关文章:

java - Android - Mediaplayer 下一个按钮不起作用

java - 使用原始值填充表单的验证失败文件输入字段以便其可以显示在 JSP 文件中的正确方法是什么?

xml - XPath 选择具有属性名称的节点

xml - 使用 Strawberry Perl 和 twig 清除 Windows 上目录树中所有文件中 xml 括号中的内容

java - JDBC - JTDS 错误?对于日期和时间类型的列 (x)

java - 以您选择的格式查看文本?

java - 正则表达式、java char + 空格和 char + 符号

xml - 这是有效的 XML 吗?

xml - 使用 XSLT 转换特定 XML 文档

python - Python 中的空 XML 元素处理