我正在尝试解析标记内部带有大文本的XML文件。有时文本中有回车符。当我调试时,我的String被一个回车符(“\ n”)覆盖,这有时会导致一个ampty字符串或只有一行的字符串。
我无法控制数据如何存储在数据库中,我只能用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.
有没有办法解析它,所以带回车符的全文出现在我的字符串中。
答案 0 :(得分:1)
我很确定回车在许多XML解析器中无效。您需要使用CData将大文本值括起来,请参阅here
如果您能够修改XML,请尝试这样的事情。
<root>
<child>
<![CDATA[
Text you want to escape goes here...
]]>
</child>
</root>
如果你不能修改xml,你需要在解析之前对字符串进行搜索替换
我希望有帮助
编辑:重新阅读你的帖子。我假设您无法更改XML?在这种情况下,您必须将XML保存读取为字符串,并在将字符串传递到SAX解析器之前搜索/替换任何“\ n”。我的笔记本电脑正在工作,所以无法分享我所做的这些代码。如果你明天还没有解决这个问题,我可以和你分享代码......答案 1 :(得分: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的值是否为空,如果不是,则连接已存在的值,否则只需分配新值。这就是它。