2016-10-03 21 views
0

這是我的XML文件。在java中使用反射api解析xml

<customer> 
    <Field Number = '1' Value = '3'> 
    <Name>customer1</Name> 
    <Length>2</Length> 
    <Type>regular</Type> 
    <Method Number = '1'>pay through cash</Method> 
    <Method Number = '2'>pay through card</Method> 
    </Field> 
    <Field Number = '2'> 
    <Name>customer2</Name> 
    <Length>2</Length> 
    <Type>rare</Type> 
    </Field> 
    <Field Number = '3'> 
    <Name>customer3</Name> 
    <Length>4</Length> 
    <Type>regular</Type> 
    </Field> 
</customer> 

我應該使用Java語言中的任何解析器解析此文件。
但是我的java源代碼不應該包含任何xml文件的組件,例如 node.getAttributes().getNamedItem("Name").getNodeValue();在上面的說明中我已經使用了「Name」,但我不應該使用它。
對於這種情況,哪種解析器是有效的。歡迎使用代碼片段。
我必須能夠動態解析這個文件,並使用標籤內容作爲類成員和setter和getter方法。所以我使用了反射API。

+0

請參考我以前的答案之一,看看它是否有助於http://stackoverflow.com/questions/37920624/how-to-map-xml-file-content-to-java-object/37920793#37920793 –

+0

我研究了Digester XML解析,但即使這樣,Java代碼依賴於XML標記的特定內容。 – sampaths

+0

我需要一個java代碼來解析標準結構的XML文件,而不考慮標籤名稱和標籤內容@RishiGoel – sampaths

回答

1

我假設你已經有相應的類型。 您可能需要稍微改變它們,因爲沒有具體(你試圖避免),你將很難分配具有相同名稱的XML元素到字段(可能的集合)。比如你要叫 所以每一個元素屬於一個集合應該或者一組(可以包含任何元素)進行處理或列表(可以包含同質元素)的元素

<ExampleSet> 
    <ExampleList> 
    <ExampleType>example1</ExampleType> 
    <ExampleType>example2</ExampleType> 
    </ExampleList> 
    <OtherExampleType>example3</OtherExampleType> 
</ExampleSet> 

現在,您可以標記每個類型與相應的接口(XmlSet,XmlList,XmlType)。 現在你可以解析它們,知道它們是否是一個他們構成其他類型的集合,如果它們是一個列表,它們是一個類型集合,或者它們只是一個類型。現在,您可以使用反射根據您通過反射確定的字段類型將XmlType的值或屬性分配給String,int,long或您需要的任何內容。

一個很抽象的理念之下,讓我知道,如果你需要更多的細節:

void readXml(Xml xml) { 
    if (xml instanceof XmlSet) readSet(xml); 
    else if (xml instanceof XmlList) readList(xml); 
    else if (xml instanceof XmlType) readType(xml); 
} 

void readSet(Xml xml) { 
    /*here you loop through the elements of set and call readXml(child)*/ 
} 

void readList(Xml xml) { 
    /*here you loop through the elements of list and call readXml(child).*/ 
} 

void readType(Xml xml) { 
    /* Here you use reflection to populate the value of elements with the corresponding java types */ 
}