/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Parsing af XML med linjeskift i Attributer~
Fra : Henrik Lynggaard


Dato : 31-08-03 22:01

Hejsa

Jeg prøver at få java til at parse en XML fil, som indeholder linjeskift
(windows-stil) i nogle af atributerne.

såsom dette tag
----
<Tool
   Name="VCNMakeTool"
   BuildCommandLine="set CFLAGS=-D_RWCONFIG_15d

set CFLAGS=/EHsc /Zi /DEBUG %CFLAGS% /Zc:wchar_t

set LIB=%LIB%;..\..\..\common\lib;..\..\..\..\MSC3PP_Comp\lib\debug

set ORA_LIB=-l oraSQL9.lib"
   Output="..\..\..\bin\SCServer.exe"/>
----


Problemet er at når jeg får fat i attributen så er det hele en linje.

Jeg bruger standard DOM til at hente filen og atrributen:
---
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse( file );
....
String value = attribbute =
Node.getAttribute("BuildCommandLine=").getNodeValue();
-----


Så er Value en enkelt linje. Jeg har også prøvet en indexOf efter
linjeskiftet, men den kunne heller ikke finde det.

Jeg har prøevet at manuelt ooprette en atrribut med et linjeskft og det
virker. f.eks.
---
Attr attribut2 = document.createAttribute("BuildTest");
attribut2.setNodeValue("first line\n\n second line");

System.out.println("Node value"+attribut2.getNodeValue());
---

Nu er linjeskiftet bevaret.

Hvad gør jeg forkert ?

mvh
henrik






 
 
Mads Orbesen Troest (31-08-2003)
Kommentar
Fra : Mads Orbesen Troest


Dato : 31-08-03 23:19

Hej;

> såsom dette tag

Det er egentlig et element.

> Jeg prøver at få java til at parse en XML fil, som indeholder linjeskift
> (windows-stil) i nogle af atributerne.

At have multiple værdier i én attribut på den måde som du viser ser MEGET,
meget galt ud! Det er måske XML syntax, men det er ikke den måde XML skal
anvendes på. Du skal tænke struktur (nu ved jeg ikke om det er dig selv der
har lavet formatet, eller om det er noget en anden har kreeret) og fx have
et separat commandline element inden i tool elementer; dette element kunne
så have multiple command elementer, eller noget lignende. Hvis det er fordi
du er ved at bøje et eksisterende tool vil jeg anbefale at lade commandline
henvise til en cmd-fil der udfører de multiple kommandoer du vil have
udført.

> Problemet er at når jeg får fat i attributen så er det hele en linje.

Det er ikke et problem, det er den måde en XML parser skal opføre sig på, og
normalize whitespace i attributterne - se:
http://www.w3.org/TR/REC-xml#AVNormalize

--
Med venlig hilsen,
/\/\\ads Orbesen Troest
---
[http://www.itu.dk/~eek]
<mads@troest.dk> <eek@itu.dk>



Henrik Lynggaard (01-09-2003)
Kommentar
Fra : Henrik Lynggaard


Dato : 01-09-03 11:41

"Mads Orbesen Troest" <mads@troest.NEVERMORE.dk> wrote in message news:<3f5273d1$0$20049$edfadb0f@dread11.news.tele.dk>...
> Hej;
>
> > såsom dette tag
>
> Det er egentlig et element.
>
> > Jeg prøver at få java til at parse en XML fil, som indeholder linjeskift
> > (windows-stil) i nogle af atributerne.
>
> At have multiple værdier i én attribut på den måde som du viser ser MEGET,
> meget galt ud! Det er måske XML syntax, men det er ikke den måde XML skal
> anvendes på. Du skal tænke struktur (nu ved jeg ikke om det er dig selv der
> har lavet formatet, eller om det er noget en anden har kreeret)

<snip>

Det er *desværre* temmelig irrelevant hvordan det burde være gjort,
for det er ikke mig som har lavet formattet. Udklippet stammer fra en
Visual Studio 7.00 (.net) c++ project fil, og dens udformning har jeg
minus kontrol over.


> > Problemet er at når jeg får fat i attributen så er det hele en linje.
>
> Det er ikke et problem, det er den måde en XML parser skal opføre sig på, og
> normalize whitespace i attributterne - se:
> http://www.w3.org/TR/REC-xml#AVNormalize

Ikke helt.. I følge det link du skriver skal linjeskift normaliseres
til #xA (10) dvs. ren unix stil for et linjeskift, den skal ikke
fjerne linjeskiftene.

Altså burde jeg kunne nå #xA tegnene i java, spørgsmållet er bare
hvordan jeg tilbage escaper til windows linjeskift ved save af filen.
Jeg har sat "windows-<nummer>" som encodig. (Igen en studio dikteret
værdi)

mvh
Henrik Lynggaard

Mads Orbesen Troest (01-09-2003)
Kommentar
Fra : Mads Orbesen Troest


Dato : 01-09-03 21:57

Hej Henrik;

> Det er *desværre* temmelig irrelevant hvordan det burde være gjort,
> for det er ikke mig som har lavet formattet. Udklippet stammer fra en
> Visual Studio 7.00 (.net) c++ project fil, og dens udformning har jeg
> minus kontrol over.
>

Ouch, utroligt at de har begået sådan en ussel XML anvendelse; men nåja, da
MS Office først hævdede at understøtte XML var der bestemt heller ikke meget
andet end overfladisk XML syntaks og ellers helt manglende dokumentstruktur
reflekteret i XML at se. :(

> Ikke helt.. I følge det link du skriver skal linjeskift normaliseres
> til #xA (10) dvs. ren unix stil for et linjeskift, den skal ikke
> fjerne linjeskiftene.

"For a white space character (#x20, #xD, #xA, #x9), append a space character
(#x20) to the normalized value."

--
Med venlig hilsen,

/\/\\ads Orbesen Troest
---
[http://www.itu.dk/~eek]
<mads@troest.dk> <eek@itu.dk>



Henrik Lynggaard (01-09-2003)
Kommentar
Fra : Henrik Lynggaard


Dato : 01-09-03 22:23

Mads Orbesen Troest wrote:
> Hej Henrik;
>
>
> Ouch, utroligt at de har begået sådan en ussel XML anvendelse; men nåja, da
> MS Office først hævdede at understøtte XML var der bestemt heller ikke meget
> andet end overfladisk XML syntaks og ellers helt manglende dokumentstruktur
> reflekteret i XML at se. :(

Man må jo håbe de har fixet de i version 7.1 (Den version hvor upgraden
kun kostede ~$30, fordi der aldrig kom service packs til 7.0)
>
>
>>Ikke helt.. I følge det link du skriver skal linjeskift normaliseres
>>til #xA (10) dvs. ren unix stil for et linjeskift, den skal ikke
>>fjerne linjeskiftene.
>
>
> "For a white space character (#x20, #xD, #xA, #x9), append a space character
> (#x20) to the normalized value."

Der står "append" til den normalizerede værdi, altså skal den tilføje et
mellemrum efter den har normaliseret.

om linje skift står der:

"All line breaks must have been normalized on input to #xA as described
in 2.11 End-of-Line Handling, so the rest of this algorithm operates on
text normalized in this way."

Afsnit 2.11 lyder:

"XML parsed entities are often stored in computer files which, for
editing convenience, are organized into lines. These lines are typically
separated by some combination of the characters carriage-return (#xD)
and line-feed (#xA).

To simplify the tasks of applications, the characters passed to an
application by the XML processor must be as if the XML processor
normalized all line breaks in external parsed entities (including the
document entity) on input, before parsing, by translating both the
two-character sequence #xD #xA and any #xD that is not followed by #xA
to a single #xA character."

dvs. at både windows stilen (#xD#xA) or tidlig Mac tror jeg det er (#xD)
udskiftes til unix stil (#xA)

Så er jeg tilbage til problemet med at få det tilbage til windows stil
ved output..

mvh
henrik





Mads Orbesen Troest (01-09-2003)
Kommentar
Fra : Mads Orbesen Troest


Dato : 01-09-03 22:43

Hej Henrik;

> > "For a white space character (#x20, #xD, #xA, #x9), append a space
character
> > (#x20) to the normalized value."
>
> Der står "append" til den normalizerede værdi, altså skal den tilføje et
> mellemrum efter den har normaliseret.
>
> om linje skift står der:
>
> "All line breaks must have been normalized on input to #xA as described
> in 2.11 End-of-Line Handling, so the rest of this algorithm operates on
> text normalized in this way."

Som jeg læser det er (1) linjeskift normaliseret INDEN
attribut-normaliserings-algoritmen anvendes; (2) under
attribut-normaliseringen erstattes de normaliserede linjeskift (og andre
whitespace karakterer) med space.

Og der er ingen måde at undgå dette på med en standards-compliant XML parser
(min kursivering):

"Before the value of an attribute is passed to the application or checked
for validity, the XML processor /must/ /normalize/ the attribute value by
applying the algorithm below."

--
Med venlig hilsen,

/\/\\ads Orbesen Troest
---
[http://www.itu.dk/~eek]
<mads@troest.dk> <eek@itu.dk>



Søg
Reklame
Statistik
Spørgsmål : 177459
Tips : 31964
Nyheder : 719565
Indlæg : 6408188
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste