Java:使用dynamicaly添加元素读取xml文件,而不使用QName

时间:2015-06-23 15:22:49

标签: 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();
            }
        }

1 个答案:

答案 0 :(得分:0)

我有一个人为一件作品做了这件事。我曾经使用过dom解析器来做到这一点。这是一个代码摘录,我重新设计了一些以适合您的使用。我在代码中假设myString包含您的XML文本。如果您有自己的流,可以直接在dBuilder中使用它。

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());
            }
        } 
    }
}

这是convertNodeToMap的代码

compare_masses <- function(mass_lst){
  for (i in seq_along(mass_lst)) {
    positions <- which(abs(AB_massLst_numeric - mass_lst[i]) < 0.02)
    rows <- AB_lst[positions,]
    match_df <- rbind(match_df, rows)
   }
}

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