is dit een geldige xpath-query?

//[dataOptions[id]] seems to work

Maar //[dataOptions [id = value]] werkt niet

Ik probeer alle ouders van dataOptions te krijgen waar dataOptions.id gelijk is aan val . Is de tweede geldig? Ik betwijfel of mijn JPath die ik gebruik om een ​​query op te lossen, een bug bevat. Maar ik weet niet zeker of mijn vraag geldig is.

[
{
    "dataOptions": {
        "id": "id1",
        "count": "10"
    },
    "name": "Leon",
    "children": [
        {
            "dataOptions": {
                "id": "id2",
                "count": "10"
            },
            "name": "Leon",
            "children": [],
            "isExpanded": false
        },
        {
            "dataOptions": {
                "id": "id2",
                "count": "10"
            },
            "name": "Leon",
            "children": [],
            "isExpanded": false
        }
    ],
    "isExpanded": false
},
{
    "dataOptions": {
        "id": "id3",
        "count": "10"
    },
    "name": "Leon",
    "children": [],
    "isExpanded": false
},
{
    "dataOptions": {
        "id": "id4",
        "count": "10"
    },
    "name": "Leon",
    "children": [],
    "isExpanded": false
}

]

1

3 antwoord

//[dataOptions [id]] lijkt te werken

     

Maar //[dataOptions [id = value]] werkt niet

Both of these are with illegal syntax (the predicate must be preceded by a node - test).

Ik probeer alle ouders van dataOption s waar te krijgen    dataOptions.id is gelijk aan val .

Use:

//*[dataOptions[id=val]]

dit selecteert alle elementen met een onderliggende element dataOptions waarvan id en val kinderen dezelfde steekwaarde hebben.

or use if val isn't an element name but a literal string, then use:

//*[dataOptions[id='val']]

UPDATE: The OP has edited the question 3 hrs after initially asked -- now we see that the input is JSON. XPath doesn't know about JSON -- it only operates on xml documents. Therefore, this question shouldn't be tagged as XPath.

2
toegevoegd
Bedankt voor de hulp. Dat leek het niet te doen. Dit is de fout die ik zie. ReferenceError: id is niet gedefinieerd ik denk dat JPath een bug bevat. Hier is de link als deze uw interesse toont. bluelinecity.com/software/jpath
toegevoegd de auteur ShaggyInjun, de bron
Snelle vraag echter. Als de bovenstaande query geen bug bevat, moeten alle objecten in alle niveaus worden geretourneerd? Moet ik bijvoorbeeld het object binnen kinderen zien terugkomen?
toegevoegd de auteur ShaggyInjun, de bron
@ShaggyInjun: Nu je de vraag hebt bewerkt en het "document" hebt opgegeven, zie ik dat dit JSON is - niet XPath. XPath kan * alleen worden gebruikt op een XML-document - niet op JSON. Deze vraag moet niet worden gemarkeerd als "xpath".
toegevoegd de auteur Dimitre Novatchev, de bron
@ShaggyInjun: snel antwoord: Ja, als de invoer een XML-document was. Nu u de vraag hebt bewerkt en de invoer hebt opgegeven, zien we dat deze JSON is en XPath niet kan worden toegepast op een JSON-object. U moet dit van 'xpath' verwijderen en de vraag taggen met een echt relevante tag.
toegevoegd de auteur Dimitre Novatchev, de bron

ShaggyInjun, Ik denk dat je iets zoekt in lijn met:

//dataOptions[id]
//dataOptions[id="id2"]

Ik heb onlangs een js-lib geschreven met de naam "defiant.js" - waarmee je query's kunt uitvoeren op JSON-structuur met XPath. Om in deze context te plaatsen - ik heb uw JSON-gegevens op deze pagina geplakt:

http://www.defiantjs.com/#xpath_evaluator

... en visueel verschillende XPath-query's tegen de structuur getest. De evaluator markeert de overeenkomsten in JSON en de bijbehorende XML-tegenpartij.

Ik hoop dat je de "defiant.js" en de bijbehorende website nuttig vindt.

1
toegevoegd
Goed werk met DefiantJS. Ik zal dit in mijn toekomstige inspanningen proberen te gebruiken. Dank je voor me te laten weten.
toegevoegd de auteur ShaggyInjun, de bron

Is er een plaats waar ik de JSON-gegevens die u probeert te gebruiken tegen JPath kunt bekijken?

U kunt ook proberen de geketende methode te gebruiken om uw gegevens uit te zoeken.

var jp = new Path(JSONDATA);

jp.$('dataOptions').$(function(n){
    return( n.$('id').json == yourvalue );
}).json;

Het XPath-gedeelte van JPath gebruikt eenvoudigweg enkele regexp's om code zoals hierboven te maken.

1
toegevoegd
Nogmaals bedankt voor JPath Bryan en voor het beantwoorden van mijn vraag. XPath is gemakkelijker te gebruiken, dus ik heb dat gebruikt. Heb de vraag bijgewerkt met json. Waardeer je hulp.
toegevoegd de auteur ShaggyInjun, de bron
jp. $ ('data'). f ("$ ('dataOptions'). $ ('id'). json == '" + key + "'") .json; Dat hierboven code retourneert de objecten, maar alleen die op het eerste niveau. Alle verdere niveaus worden genegeerd
toegevoegd de auteur ShaggyInjun, de bron
Bedankt, dat werkte. Ik zou willen dat er meer documentatie over de syntaxis van de JPath-query beschikbaar was.
toegevoegd de auteur ShaggyInjun, de bron
Als ik begrijp wat u uit de gegevens probeert te halen, zou de onderstaande vraag voor u moeten werken.//* [dataOptions/id = 'someval'] of met behulp van de methoden jp. $$ ('*'). $ (function (n) {return (n. $ ('dataOptions/id'). json == ' val ');}). json;
toegevoegd de auteur Bryan English, de bron