2011-04-18 82 views
0

我試圖使用標籤內部的大文本解析XML文件。有時文本中有回車符。當我調試時,我的字符串被一個回車符(「\ n」)覆蓋,這有時會導致一個空字符串或一行只有一個字符串。使用Carriage解析XML標籤以文本形式返回

我無法控制數據如何存儲在數據庫中,我只能用XML讀取數據。有些人把回車放在每個標籤後面,這導致空的字符串。 XML文件的

例子:

<?xml version="1.0" encoding="utf-8" ?> 
<vacaturedetails> 
<details> 
<titel>MEDEWERKER VOOR ONDERHOUDSDIENST</titel> 
<werkveld>METAALMECHANICA</werkveld> 
<regio>Regio Roeselare- Izegem</regio> 
<tewerkstellingsplaats>Bedrijf in Roeselare met goeie reputatie.</tewerkstellingsplaats> 
<diploma1>A2 (Beroeps + 7ej, Technisch, ASO)</diploma1> 
<diploma2>A3 (Beroeps tot 6e j, Deeltijds, Leercontract)</diploma2> 
<taal1>Nederlands</taal1> 
<ervaring>6 maand - 2 jaar</ervaring> 
<rijbewijs>B</rijbewijs> 
<rijbewijsOmsch>Auto</rijbewijsOmsch> 
<omschrijving>- Inzicht in, en zelfstandig kunnen monteren en lassen van metalen constructies. - Hulp bij het ontwikkelen van nieuwe constructies van onderdelen in de productielijn of verbeteren van bestaande constructies. - Kunnen rijden met heftruck en werken met hoogtewerker. - Plaatsen van leidingen voor perslucht, water, ...en sanitair. - Kleine herstellingen uitvoeren. - Hulp bij verhuis binnen het bedrijf. - Allerhande klusjes die nodig zijn aan en rond de bedrijfsgebouwen. </omschrijving> 
<aanbod>Dagwerk met een goeie verloning in een goei werksfeer. Optie vast na uitzendperiode. </aanbod> 
<profiel>- Kunnen lassen met halfautomaat, kennis autogeen lassen is een pluspunt. - Kunnen rijden met heftruck (attest is een pluspunt) en werken met hoogtewerker. - Inzicht hebben en zelfstandig kunnen monteren van constructies. - Kennis van sanitair (water, gas, perslucht) - Ervaring is een must!</profiel> 
</details> 
</vacaturedetails> 

這是我的解析器的樣子:

package stage.accent.webservice; 

import org.xml.sax.Attributes; 
import org.xml.sax.SAXException; 
import org.xml.sax.helpers.DefaultHandler; 

import stage.accent.domain.VacatureDetails; 

public class vacatureDetailsWebservice extends DefaultHandler { 

private boolean vacaturedetailstag = false; 
private boolean detailstag = false; 
private boolean titeltag = false; 
private boolean werkveldtag = false; 
private boolean tewerkstellingsplaatstag = false; 
private boolean diploma1tag = false; 
private boolean diploma2tag = false; 
private boolean taal1tag = false; 
private boolean taal2tag = false; 
private boolean taal3tag = false; 
private boolean taal4tag = false; 
private boolean taal5tag = false; 
private boolean ervaringtag = false; 
private boolean omschrijvingtag = false; 
private boolean aanbodtag = false; 
private boolean profieltag = false; 
private boolean rijbewijstag = false; 
private boolean rijbewijsOmschtag = false; 

private String test; 


//private Vacature vacature = new Vacature(); 
private VacatureDetails details; 

public VacatureDetails getVacatures() { 
    return this.details; 

} 

@Override 
public void startDocument() throws SAXException { 

    this.details = new VacatureDetails(); 
} 

@Override 
public void endDocument() throws SAXException { 
    // Nothing to do 
} 

/** Gets be called on opening tags like: 
* <tag> 
* Can provide attribute(s), when xml was like: 
* <tag attribute="attributeValue">*/ 
@Override 
public void startElement(String namespaceURI, String localName, 
     String qName, Attributes atts) throws SAXException { 
    if (localName.equals("vacaturedetails")) { 
     this.vacaturedetailstag = true;    
    }else if (localName.equals("details")) { 
     this.detailstag = true; 
    }else if (localName.equals("titel")) { 
     this.titeltag = true; 
    }else if (localName.equals("werkveld")){ 
     this.werkveldtag = true; 
    }else if (localName.equals("tewerkstellingsplaats")){ 
     this.tewerkstellingsplaatstag = true; 
    }else if (localName.equals("diploma1")){ 
     this.diploma1tag = true; 
    }else if (localName.equals("diploma2")){ 
     this.diploma2tag = true; 
    }else if (localName.equals("taal1")){ 
     this.taal1tag = true; 
    }else if (localName.equals("taal2")){ 
     this.taal2tag = true; 
    }else if (localName.equals("taal3")){ 
     this.taal3tag = true; 
    }else if (localName.equals("taal4")){ 
     this.taal4tag = true; 
    }else if (localName.equals("taal5")){ 
     this.taal5tag = true; 
    }else if (localName.equals("ervaring")){ 
     this.ervaringtag = true; 
    }else if (localName.equals("rijbewijs")){ 
     this.rijbewijstag = true; 
    }else if (localName.equals("rijbewijsOmsch")){ 
     this.rijbewijsOmschtag = true; 
    }else if (localName.equals("omschrijving")){ 
     this.omschrijvingtag = true; 
    }else if (localName.equals("aanbod")){ 
     this.aanbodtag = true; 
    }else if (localName.equals("profiel")){ 
     this.profieltag = true; 
    } 
} 

/** Gets be called on closing tags like: 
* </tag> */ 
@Override 
public void endElement(String namespaceURI, String localName, String qName) 
     throws SAXException { 
    if (localName.equals("vacaturedetails")) { 
     this.vacaturedetailstag = false; 
    }else if (localName.equals("details")) { 
     this.detailstag = false; 
    }else if (localName.equals("titel")) { 
     this.titeltag = false; 
    }else if (localName.equals("werkveld")){ 
     this.werkveldtag = false; 
    }else if (localName.equals("tewerkstellingsplaats")){ 
     this.tewerkstellingsplaatstag = false; 
    }else if (localName.equals("diploma1")){ 
     this.diploma1tag = false; 
    }else if (localName.equals("diploma2")){ 
     this.diploma2tag = false; 
    }else if (localName.equals("taal1")){ 
     this.taal1tag = false; 
    }else if (localName.equals("taal2")){ 
     this.taal2tag = false; 
    }else if (localName.equals("taal3")){ 
     this.taal3tag = false; 
    }else if (localName.equals("taal4")){ 
     this.taal4tag = false; 
    }else if (localName.equals("taal5")){ 
     this.taal5tag = false; 
    }else if (localName.equals("ervaring")){ 
     this.ervaringtag = false; 
    }else if (localName.equals("rijbewijs")){ 
     this.rijbewijstag = false; 
    }else if (localName.equals("rijbewijsOmsch")){ 
     this.rijbewijsOmschtag = false; 
    }else if (localName.equals("omschrijving")){ 
     this.omschrijvingtag = false; 
    }else if (localName.equals("aanbod")){ 
     this.aanbodtag = false; 
    }else if (localName.equals("profiel")){ 
     this.profieltag = false; 
    } 
} 

/** Gets be called on the following structure: 
* <tag>characters</tag> */ 
@Override 
public void characters(char ch[], int start, int length) { 
    if(this.titeltag){ 
     details.setTitel(new String(ch, start, length)); 
    } 
    if(this.werkveldtag){ 
     details.setWerkveld(new String(ch, start, length)); 
    } 
    if(this.tewerkstellingsplaatstag){ 
     details.setTewerkstellingsplaats(new String(ch, start, length)); 

    } 
    if(this.diploma1tag){ 
     details.setDiploma1(new String(ch, start, length)); 
    } 
    if(this.diploma2tag){ 
     details.setDiploma2(new String(ch, start, length)); 
    } 
    if(this.taal1tag){ 
     details.setTaal1(new String(ch, start, length)); 
    } 
    if(this.taal2tag){ 
     details.setTaal2(new String(ch, start, length)); 
    } 
    if(this.taal3tag){ 
     details.setTaal3(new String(ch, start, length)); 
    } 
    if(this.taal4tag){ 
     details.setTaal4(new String(ch, start, length)); 
    } 
    if(this.taal5tag){ 
     details.setTaal5(new String(ch, start, length)); 
    } 
    if(this.ervaringtag){ 
     details.setErvaring(new String(ch, start, length)); 
    } 
    if(this.rijbewijstag){ 
     details.setRijbewijs(new String(ch, start, length)); 
    } 
    if(this.rijbewijsOmschtag){ 
     details.setRijbewijsOmsch(new String(ch, start, length)); 
    }   
    if(this.omschrijvingtag){ 
     details.setOmschrijving(new String(ch, start, length)); 
    } 
    if(this.aanbodtag){ 
     details.setAanbod(new String(ch, start, length)); 
    } 
    if(this.profieltag){ 
     details.setProfiel(new String(ch, start, length)); 
    } 
    test = details.toString(); 
} 

}

omschrijving的這個例子的輸出是= - Allerhande klusjes die nodig zijn aan en rond de bedrijfsgebouwen.

有沒有什麼辦法解析這個問題,這樣就可以得到帶有馬車r的全文eturns出現在我的字符串中。

回答

1

我知道你總是用最後一個塊覆蓋該標籤的值。 替換這段代碼的方法characters

if(this.omschrijvingtag){ 
    details.setOmschrijving(new String(ch, start, length)); 
} 

if(this.omschrijvingtag){ 
    details.setOmschrijving((details.getOmschrijving() != null? details.getOmschrijving() : "") + new String(ch, start, length)); 
} 

編輯:基本上,你要做的就是檢查Omschrijving的值是否設置與否,並採取相應的行動。如果這個代碼混淆你,看看同樣的事情一點點不同的表達

if(this.omschrijvingtag){ 
    if(details.getOmschrijving() != null) { 
     details.setOmschrijving(details.getOmschrijving() + new String(ch, start, length)); 
    } 
    else { 
     details.setOmschrijving(new String(ch, start, length)); 
    } 
} 

所以你檢查Omschrijving的值是否爲空,如果不是的話,您連接已經存在的價值,否則你只需分配新的值。這是非常多的。

+0

非常感謝!這工作像一個魅力,但不幸的是我只是一個非常基本的程序員,我不太瞭解代碼。你想和我分享嗎?非常感謝你! – Hannelore 2011-04-18 11:24:09

+0

沒問題,夥計。看看編輯,我添加了一些解釋。 – 2011-04-18 11:33:02

1

我很確定回車在許多XML解析器中無效。你需要用CData包含大的文本值,參見here

即如果你能夠修改XML,就試試類似這樣的東西。

<root> 
    <child> 
    <![CDATA[ 
    Text you want to escape goes here... 
    ]]> 
    </child> 
</root> 

如果你不能修改你需要分析

之前做字符串搜索替換XML我希望幫助

編輯:剛剛重新看了你的帖子。我假設你無法更改XML?在這種情況下,必須先將XML保存讀入字符串,然後在將字符串傳遞到SAX解析器之前搜索/替換任何「\ n」。我的筆記本電腦在工作,所以不能共享代碼,我已經做到了這一點。如果你明天還沒有解決這個問題,我可以與你分享代碼然後...

+0

感謝您的快速反應!由於我無法更改XML,因此CDATA解決方案對我來說不是真正的選擇。我已經嘗試了@Elijah Saounkine的代碼,他也回答了這個問題,並且工作正常!我認爲他的代碼是最好的解決方案,因爲回車仍然需要顯示在輸出中。 – Hannelore 2011-04-18 11:26:36

+0

很高興你得到它解決:) – wired00 2011-04-18 11:28:41

+0

謝謝,這爲我工作。有趣的是,如果在文本的中間鍵入]]>它可以破壞xml文檔,因此必須檢查文本中沒有]]>,對吧? – Lumis 2013-01-04 23:40:45