Avatar billede stig3 Mester
26. november 2010 - 14:09 Der er 6 kommentarer og
1 løsning

XPath spørgsmål

Hej

Et Xpath spørgsmål

Jeg har følgende XML fil:
================================
<ORDER>
    <HEAD>
        <ID>888</ID>
        <LINEs>
            <ID>10</ID>
            <ID>20</ID>
            <ID>30</ID>
        </LINEs>
    </HEAD>
    <HEAD>
        <ID>999</ID>
        <LINEs>
            <ID>10</ID>
            <ID>20</ID>
            <ID>30</ID>
            <ID>40</ID>
        </LINEs>
    </HEAD>
</ORDER>



Jeg finder linierne med denne.
.//ORDER/HEAD/LINES/ID
========================
<ID>10</ID>
<ID>20</ID>
<ID>30</ID>
<ID>10</ID>
<ID>20</ID>
<ID>30</ID>
<ID>40</ID>


For at finde HEAD'erne kan jeg bruge denne:
.//ORDER/HEAD/ID
=======================
<ID>888</ID>
<ID>999</ID>

Problemet er at jeg ikke ved hvilke linier der hører til ordre 888 og hvilke der hører til 999

??????? Hvordan får jeg resultatet ??????
========================================
<ID>888</ID>
<ID>888</ID>
<ID>888</ID>
<ID>999</ID>
<ID>999</ID>
<ID>999</ID>
<ID>999</ID>


Denne er på sporet uden at ramme:
.//ORDER/HEAD/ID|.//ORDER/HEAD/LINES/ID
=========================================
<ID>888</ID>
<ID>10</ID>
<ID>20</ID>
<ID>30</ID>
<ID>999</ID>
<ID>10</ID>
<ID>20</ID>
<ID>30</ID>
<ID>40</ID>
Avatar billede arne_v Ekspert
26. november 2010 - 14:31 #1
pseudo code:

for each node n in select //ORDER/HEAD
    n select single ID/text()
    for each node n2 in select LINEs/ID/text()
        ...
    end for
end for
Avatar billede arne_v Ekspert
26. november 2010 - 14:31 #2
Hvis du fortæller hvad du programmerer i kan jeg give noget mere specifikt.
Avatar billede stig3 Mester
26. november 2010 - 15:14 #3
Tak for det hurtige svar.

Jeg "programmerer" ikke som sådan.
Vi har en løsning ala bizztalk der kan sende data fra et system til et andet.

Indbygget i vores program bruges MSXML6.0 til at query'e i DOM'en.

Så det er desværre ikke lige det jeg har brug for....

Jeg har brug for en XPath query der direkte henter værdierne:
888
888
888
999
999
999
999
(Hvis det da er muligt....)

Jeg har set der er en parent::XXXXX funktion i XPath, men kan ikke få det til at virke.

Jeg har testet exemplerne herfra:
http://msdn.microsoft.com/en-us/library/ms256086.aspx

på denne side:
http://www.bit-101.com/xpath/

Men får ingen resultater ved brug af parent eksemplerne.
Avatar billede stig3 Mester
26. november 2010 - 15:41 #4
Hvis man ikke kan lave en direkte xpath query, der giver det ovenstående er der en anden mulighed.

Jeg kan angive en XSLT fil til at transformere xml filen først.
Derefter kan jeg bruge xpath til at fremsøge det ønskede....
Avatar billede arne_v Ekspert
28. november 2010 - 01:48 #5
Prøv om det er lidt nemmere efter dette her:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<all>
<xsl:for-each select="//ORDER/HEAD/LINEs/ID">
    <one>
        <headid><xsl:value-of select="../../ID"/></headid><lineid><xsl:value-of select="."/></lineid>
    </one>
</xsl:for-each>
</all>
</xsl:template>
</xsl:stylesheet>
Avatar billede stig3 Mester
29. november 2010 - 10:02 #6
Hej Arne

Tak for hjælpen.
XSLT'en finder det jeg leder efter.

Smider du et svar, så jeg kan give point ?

Og en anden ting.
Det kan ikke lade sige gøre at skrive en direkt XPath kommando vel ?
Det ville være lidt enklere, hvis man kunne det...
Avatar billede arne_v Ekspert
29. november 2010 - 14:56 #7
svar

Jeg ved ikke om man kan goere det med XPath. Men det ligger ihvertfald udover hvad jeg kan.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester