在具有相同命名的子节点的同时从XML文件检索特定元素 [英] Retrieving specific elements from XML file while having child nodes with same naming

查看:111
本文介绍了在具有相同命名的子节点的同时从XML文件检索特定元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

检索测试语言本地化时,我遇到了一些问题。我在这里创建了XML文档,我想要只有< EN> Common Test< / EN>要返回的元素值或只有 DE或EN 的DEAllgemeiner Test< / DE>如果我有一个 NodeList out of TESTSTEP ,我得到子节点,我也从 TEST 元素,但我只想从 TESTSTEP 元素中添加一个语言元素。如何使用 DOM 实现这一点?

 <?xml version =1.0encoding =ISO-8859-1standalone =no?> 
< DSCT2C>
< TESTSTEPS APPLICATION =UGS>

< TESTSTEP ORDER_NUMBER =0>
< EN>普通测试< / EN>
< DE> Allgemeiner测试< / DE>

< TEST ORDER_NUMBER =0NEED_FUNCTION =trueFUNCTION_NAME =functionName>
< DESCRIPTION>
< DE> Hallo< / DE>
< EN> Hello< / EN>
< / DESCRIPTION>
< FILES>
< FILE> test.prt< / FILE>
< FILE> test.drw< / FILE>
< / FILES>
< / TEST>
< TEST ORDER_NUMBER =1NEED_FUNCTION =false>
< DESCRIPTION>
< DE> Hallo2< / DE>
< EN> Hello2< / EN>
< / DESCRIPTION>
< FILES>
< / FILES>
< / TEST>
< / TESTSTEP>

< / TESTSTEPS>
< / DSCT2C>

编辑:
我自己找到一个解决方案,这很简单;): / p>

  public String getTestStepDescription(String langCode,Integer orderNumber)
{
NodeList list = documentTest.getElementsByTagName(XmlElements .TESTSTEP.toString()); (int i = 0; i< list.getLength(); i ++)
{
元素e =(Element)list.item(i);

if(e.getAttribute(XmlAttributes.ORDER_NUMBER.toString())。equals(orderNumber.toString()))
{
NodeList neu = e.getElementsByTagName(langCode.toUpperCase()) ;
for(int j = 0; j< neu.getLength(); j ++)
{
元素e2 =(Element)neu.item(j);
if(e2.getParentNode()。getNodeName()。equals(XmlElements.TESTSTEP.toString()))
{
return neu.item(j).getFirstChild()。getNodeValue );
}
}
}
}

返回ERROR_NO_TESTSTEP_DESC;
}


解决方案

尝试此方法。 p>

  public ArrayList< String> readXML(String xmlString,String elementName,
String textContent){
ArrayList< String> resultValues = new ArrayList< String>();
try {
boolean elementNameFlag = false,nodenameFlag = false;

DocumentBuilder dbFactory = DocumentBuilderFactory.newInstance()
.newDocumentBuilder();

InputSource is = new InputSource();

is.setCharacterStream(new StringReader(xmlString));

文档doc = dbFactory.parse(is);

NodeList list = doc.getElementsByTagName(*);

String rootNodeName = doc.getDocumentElement()。getNodeName();

if(elementName == rootNodeName || textContent == rootNodeName){
gl.writeWarning(elementName或nodeName不应该是根名称);
} else {

for(int i = 0; i< list.getLength(); i ++){

元素元素=(元素)列表。项目(i);
if(elementName == element.getNodeName()){
elementNameFlag = true;
}

if(textContent == element.getNodeName()){
nodenameFlag = true;
}
}


if(elementNameFlag == nodenameFlag){

doc.getDocumentElement()。normalize();

NodeList nList = doc.getElementsByTagName(elementName); (int temp = 0; temp< nList.getLength(); temp ++){
Node nNode = nList.item(temp);


if(nNode.getNodeType()== Node.ELEMENT_NODE){
元素eElement =(Element)nNode;

resultValues
.add(getTagValue(textContent,eElement));
}
}
} else {

}
}
} catch(异常e){

e.printStackTrace();
}
return resultValues;
} // readXML()

调用像

  objectname.readXML(xmlString,TESTSTEP,EN)


I' am having some problems retrieving language localizations for teststep. I created the XML document down here and I want to have just <EN>Common Test</EN> <DE>Allgemeiner Test</DE> elemnt values to be returned or just DE or EN. If I have a NodeList out of TESTSTEP and I get the child nodes, I also get the language elements from the TEST element, but I only want to have one language element from the TESTSTEP element. How can I achieve this using DOM?

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
    <DSCT2C>
        <TESTSTEPS APPLICATION="UGS">

            <TESTSTEP ORDER_NUMBER="0">
                <EN>Common Test</EN>
                <DE>Allgemeiner Test</DE>

                <TEST ORDER_NUMBER="0" NEED_FUNCTION="true" FUNCTION_NAME="functionName">
                    <DESCRIPTION>
                        <DE>Hallo</DE>
                        <EN>Hello</EN>
                    </DESCRIPTION>
                    <FILES>
                        <FILE>test.prt</FILE>
                        <FILE>test.drw</FILE>
                    </FILES>
                </TEST>
                <TEST ORDER_NUMBER="1" NEED_FUNCTION="false">
                    <DESCRIPTION>
                        <DE>Hallo2</DE>
                        <EN>Hello2</EN>
                    </DESCRIPTION>
                    <FILES>
                    </FILES>
                </TEST>
            </TESTSTEP>

        </TESTSTEPS>
    </DSCT2C>

EDIT: I found a solution by myself and it was quite simply ;) :

  public String getTestStepDescription(String langCode, Integer orderNumber)
  {
    NodeList list = documentTest.getElementsByTagName(XmlElements.TESTSTEP.toString());
    for (int i = 0; i < list.getLength(); i++)
    {
      Element e = (Element) list.item(i);
      if (e.getAttribute(XmlAttributes.ORDER_NUMBER.toString()).equals(orderNumber.toString()))
      {
        NodeList neu = e.getElementsByTagName(langCode.toUpperCase());
          for(int j = 0; j < neu.getLength(); j++)
          {
            Element e2 = (Element) neu.item(j);
            if(e2.getParentNode().getNodeName().equals(XmlElements.TESTSTEP.toString()))
            {
              return neu.item(j).getFirstChild().getNodeValue();
            }
          }
      }
    }

    return "ERROR_NO_TESTSTEP_DESC";
  }

解决方案

Try this method.

public ArrayList<String> readXML(String xmlString, String elementName,
        String textContent) {
    ArrayList<String> resultValues = new ArrayList<String>();
    try {
        boolean elementNameFlag = false, nodenameFlag = false;

        DocumentBuilder dbFactory = DocumentBuilderFactory.newInstance()
                .newDocumentBuilder();

        InputSource is = new InputSource();

        is.setCharacterStream(new StringReader(xmlString));

        Document doc = dbFactory.parse(is);

        NodeList list = doc.getElementsByTagName("*");

        String rootNodeName = doc.getDocumentElement().getNodeName();

        if (elementName == rootNodeName || textContent == rootNodeName) {
            gl.writeWarning("elementName or nodeName should not be root name");
        } else {

            for (int i = 0; i < list.getLength(); i++) {

                Element element = (Element) list.item(i);
                if (elementName == element.getNodeName()) {
                    elementNameFlag = true;
                }

                if (textContent == element.getNodeName()) {
                    nodenameFlag = true;
                }
            }


            if (elementNameFlag == nodenameFlag) {

                doc.getDocumentElement().normalize();

                NodeList nList = doc.getElementsByTagName(elementName);

                for (int temp = 0; temp < nList.getLength(); temp++) {
                    Node nNode = nList.item(temp);
                    if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                        Element eElement = (Element) nNode;

                        resultValues
                                .add(getTagValue(textContent, eElement));
                    }
                }
            } else {

            }
        }
    } catch (Exception e) {

        e.printStackTrace();
    }
    return resultValues;
}// readXML()

call like

objectname.readXML(xmlString,"TESTSTEP","EN")

这篇关于在具有相同命名的子节点的同时从XML文件检索特定元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆