2011-04-18 3 views
0

큰 텍스트로 된 XML 파일을 태그 내부에서 파싱하려고합니다. 때때로 텍스트에는 캐리지 리턴이 있습니다. 내가 디버깅 할 때 내 문자열 캐리지 리턴 ("\ n") 때로는 빈 문자열 또는 단 한 줄의 문자열로 이어지는 덮어 쓰게됩니다.캐리지가있는 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.

이것을 해석 할 수있는 방법이 있는가? eturn이 내 String에 나타납니다.

답변

1

나는 그 태그의 값을 항상 마지막 청크로 덮어 쓰는 것을 이해합니다.

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

편집과 방법 characters

if(this.omschrijvingtag){ 
    details.setOmschrijving(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

+0

문제 없습니다. 편집을 확인하고 몇 가지 설명을 추가했습니다. –

1

캐리지 리턴은 많은 XML 파서에서 유효하지 않습니다. 큰 텍스트 값을 CData로 묶어야합니다. here

예 : XML을 수정할 수있는 경우이를 시도해보십시오. 당신의 글을 다시 읽어 : 당신은 당신이

를 분석하기 전에 검색 문자열에 교체 할 필요가있을 XML을 수정할 수없는 경우

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

내가 그

EDIT 도움이되기를 바랍니다. XML을 변경할 수 없다고 가정합니까? 이 경우 문자열을 SAX 파서에 전달하기 전에 XML 저장을 문자열로 읽고 "\ n"을 검색/바꾸어야합니다. 내 랩탑이 작동 중이므로 코드를 공유 할 수 없습니다. 그래도 내일까지 해결하지 못했다면 코드를 공유 할 수 있습니다 ...

+0

빠른 응답을 보내 주셔서 감사합니다. XML을 변경할 수 없기 때문에 CDATA 솔루션은 나를위한 진정한 옵션이 아닙니다. @ 엘리야 사운 킨 (Elanah Saounkine)의 코드도 시도해 보았습니다. 캐리지 리턴이 여전히 출력에 표시되어야하기 때문에 코드가 가장 좋은 해결책이라고 생각합니다. – Hannelore

+0

다행 니가 해결해 줬어. :) – wired00

+0

고마워,이게 나를 위해 잘됐다.흥미롭게도, 한 종류의]]> 텍스트 중간에 XML 문서가 망가질 수 있으므로 텍스트에]]> 있는지 확인해야합니다. – Lumis