2011-04-18 85 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