2016-06-23 37 views
0

我有一个自定义XML像如何在Java中使用异构标签从自定义XML中获取值?

<InputData> 
    <dbproperties> 
     <dburl>dbURL</dburl> 
     <dbuser>DBUSER</dbuser> 
     <dbpasskey>DBPASS</dbpasskey> 
     <driver>oracle.jdbc.driver.OracleDriver</driver>  
    </dbproperties> 
    <tdata> 
     <size>4</tdata>  
     <tcount>6</tcount> 
    </threaddata> 
    <qdata> 
     <sql> 
      select syadate from dual; 
     </sql> 
    </qdata> 
</InputData> 

现在我需要阅读这个XML,需要TP提取每个变量的值。像

dburl = dbURL 
dbuser = DBUSER 
dbpasskey = DBPASS 
driver = oracle.jdbc.driver.OracleDriver 
size = 4 
tcount = 6 
sql = select syadate from dual; 

如何以有效的方式做到这一点,而不需要硬编码任何Java类。

即,我将输入xml文件名。 Java类应如上所述打印数据输出。

+0

你只在jaxb上做它? –

回答

0

第1步:将您的XML保存到系统中的文件(比如“d:/test.xml”)。

<InputData> 
    <dbproperties> 
     <dburl>dbURL</dburl> 
     <dbuser>DBUSER</dbuser> 
     <dbpasskey>DBPASS</dbpasskey> 
     <driver>oracle.jdbc.driver.OracleDriver</driver>  
    </dbproperties> 
    <tdata> 
     <size>4</size>  
     <tcount>6</tcount> 
    </tdata> 
    <qdata> 
     <sql> 
      select syadate from dual; 
     </sql> 
    </qdata> 
</InputData> 

第2步:现在,创建以下类来运行您的程序。

InputDataDemo.java

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.LinkedHashMap; 
import java.util.Map; 
import java.util.Set; 

import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 

import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.xml.sax.SAXException; 

public class InputDataDemo { 
    public static final String DB_URL = "dburl"; 
    public static final String DB_USER = "dbuser"; 
    public static final String DB_PASS_KEY = "dbpasskey"; 
    public static final String DRIVER = "driver"; 
    public static final String SIZE = "size"; 
    public static final String TCOUNT = "tcount"; 
    public static final String SQL = "sql"; 

    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { 
     File inputFile = new File("D:/test.xml"); 
     Map<String, String> map = getInputDataMap(new FileInputStream(inputFile)); 
     Set<String> keySet = map.keySet(); 
     for (String key : keySet) { 
      System.out.println(key + ": " + map.get(key).trim()); 
     } 
    } 

    public static Map<String, String> getInputDataMap(InputStream inputStream) 
      throws ParserConfigurationException, SAXException, IOException { 

     Map<String, String> inputMap = new LinkedHashMap<String, String>(); 
     Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(inputStream); 
     doc.getDocumentElement().normalize(); 
     inputMap.put(DB_URL, ((Element) doc.getElementsByTagName(DB_URL).item(0)).getTextContent()); 
     inputMap.put(DB_USER, ((Element) doc.getElementsByTagName(DB_USER).item(0)).getTextContent()); 
     inputMap.put(DB_PASS_KEY, ((Element) doc.getElementsByTagName(DB_PASS_KEY).item(0)).getTextContent()); 
     inputMap.put(DRIVER, ((Element) doc.getElementsByTagName(DRIVER).item(0)).getTextContent()); 
     inputMap.put(SIZE, ((Element) doc.getElementsByTagName(SIZE).item(0)).getTextContent()); 
     inputMap.put(TCOUNT, ((Element) doc.getElementsByTagName(TCOUNT).item(0)).getTextContent()); 
     inputMap.put(SQL, ((Element) doc.getElementsByTagName(SQL).item(0)).getTextContent()); 
     return inputMap; 
    } 
} 
+0

嗨,我很抱歉。忘了提及。输入xml将有不同的标记集。它不会一直是同一个xml。所以我不应该为此创造一个pojo。程序应自动读取文件并从中返回数据图。 – opensourcegeek

+0

嗨@KarthikeyanGovindaraj你的问题解决了吗? –

0

如果不排除非基于JAXB解决方案...这里是使用XPath和VTD-XML做这件事的方式。这样做的好处是,你可以从字面上把尽可能多的元素/值对的文件,它仍然会工作......零配置...

import com.ximpleware.*; 

public class dumpKeyValue { 

    public static void main(String[] s) throws VTDException{ 
     VTDGen vg = new VTDGen(); 
     AutoPilot ap = new AutoPilot(); 
     ap.selectXPath("//*[text()]"); 
     if (!vg.parseFile("d:\\xml\\keyValue.xml", false)){ 
      System.out.println("invalid xml"); 
      System.exit(0); 
     } 
     VTDNav vn = vg.getNav(); 
     ap.bind(vn); 
     int i=0; 
     while((i=ap.evalXPath())!=-1){ 
      System.out.println(" "+vn.toRawString(i)+" = "+vn.toNormalizedString(vn.getText())); 
     } 
    } 
} 
0

如果您使用的是Java 8,你可以尝试使用XmlDynamic

XmlDynamic xml = new XmlDynamic("<InputData>" + // the xml 
    " <dbproperties>" + 
    " <dburl>dbURL</dburl>" + 
    " <dbuser>DBUSER</dbuser>" + 
    " <dbpasskey>DBPASS</dbpasskey>" + 
    " <driver>oracle.jdbc.driver.OracleDriver</driver>" + 
    " </dbproperties>" + 
    " <tdata>" + 
    " <size>4</size> " + 
    " <tcount>6</tcount>" + 
    " </tdata>" + 
    " <qdata>" + 
    " <sql>select syadate from dual;</sql>" + 
    " </qdata>" + 
    "</InputData>"); 

xml.get("InputData").children() 
    .flatMap(Dynamic::children) 
    .forEach(element -> System.out.println(element.key().asString() + " = " + element.asString())); 

这将打印出所有深度2标签名称(键)和内容,即在这种情况下:

dburl = dbURL 
dbuser = DBUSER 
dbpasskey = DBPASS 
driver = oracle.jdbc.driver.OracleDriver 
size = 4 
tcount = 6 
sql = select syadate from dual; 

见​​

相关问题