![](/img/trans.png)
[英]Is there a way to render JAVA components/containers in a HTML/XML fashion?
[英]More generic way to parse XML from Java in a streaming fashion?
我需要有效地解析可能非常大的XML文件(因此無法將整個文件放入內存中)。 因此,我研究了XMLStreamReader之類的流技術,但是這些技術看起來很底層,並且會產生非常硬的代碼:
event = parser.next();
switch (event)
{
case XMLStreamConstants.START_ELEMENT:
elementName = parser.getLocalName();
if (elementName.equals("name")){
state = FOUND_A_NAME;
}else if (elementName.equals("address")){
state = FOUND_AN_ADDRESS;
}
ETC...
}
我正在尋找一種方法,而不將解析器與要解析的內容緊密耦合,此外,此代碼感覺不對。 看來這應該更真正地面向事件。
有什么建議嗎?
SAX的事件可以完全按照您的想法執行。.:) http://www.saxproject.org/quickstart.html演示了一個簡單的代碼庫。 我想念什么嗎?
如果您正在尋找用於以流模式處理XML的高級語言,並且不介意處於最新狀態,請考慮Saxon-EE 9.3 XSLT中的流功能-XSLT 3.0草案的部分實現規格。
http://www.saxonica.com/documentation/sourcedocs/streaming.xml
這可以寫成通用的。 例如,我有一個屬性文件,該文件在xml元素名稱和類字段名稱/哈希映射鍵名稱之間進行了映射。
if (event.isStartElement()) {
if (event.asStartElement().getName().getLocalPart().equals(XMLElementName)) {
event = eventReader.nextEvent();
fields.put(classFieldName, event.asCharacters().getData());
continue;
}
}
這有助於我們擁有一個解析器來解析不同的xml消息。 這只是一個想法..我們可以做更多..
我認為代碼的緊密耦合本質與StAX無關,這只是您選擇編寫代碼的方式。
您可以使用查找表(例如,將元素名稱添加到處理程序對象)輕松地重構該代碼,以將事件的處理委派給處理程序對象。 這種機制是完全通用和可重用的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.