commons-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Paul A. Jackson" <>
Subject [jxpath] Unable to iterate over maps with fields containing spaces
Date Wed, 08 Sep 2010 23:52:33 GMT
I am new to jxpath, so please forgive my improper use of terminology or other ignorance.

I have a data structure consisting of nested maps and lists.  I am able to iterate over these
elements with ease as long as I stick to a path-based xpaths ("key1/key2/key3"), however,
this approach fails if my keys contain illegal characters such as spaces.  To solve this problem,
I translate these xpaths into predicate-based xpaths ("./[@name='key 1'][@name='key 2'][@name='key
3']).  This solves the illegal-character problem but breaks the ability to iterate over lists.
 My impulse is to revert to path-based xpaths and create a map-wrapper exposes url-encoded
keys in its API, but it occurs to be that there must be an easier way.  Any suggestions? 
Is there a way to use the @name= notation while retaining the ability to iterate?  I am hoping
for some kind of [*] delimiter to put in the xpath.

    List<Map> records = new ArrayList<Map>();
    Map record = new HashMap();
    List<Map> families = new ArrayList<Map>();
    record.put("Families", families);
    Map family = new HashMap();
    family.put("Wife", "Karen");
    JXPathContext rootContext = JXPathContext.newContext(dataMap);
    String xpath = "Families/Wife";
    assertNotNull("Blank Wife", rootContext.getValue(xpath));
    Iterator pointerIterator = rootContext.iteratePointers(xpath);
    assertTrue("Missing next Wife.", pointerIterator.hasNext());
    xpath = ".[@name = 'Families'][@name = 'Wife']";
    assertNotNull("Blank encoded Wife", rootContext.getValue(xpath));
    pointerIterator = rootContext.iteratePointers(xpath);
    assertTrue("Missing next encoded Wife.", pointerIterator.hasNext()); // Fails here

Thanks in advance.

Paul Jackson

  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message