• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: XML Namespace Definitions on Non-Root Elements
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: XML Namespace Definitions on Non-Root Elements


  • Subject: Re: XML Namespace Definitions on Non-Root Elements
  • From: Matt Neuburg <email@hidden>
  • Date: Mon, 07 Mar 2011 09:23:56 -0800

Very cool, but I do suggest you file a bug. Apple's XPath interface falls short with regard to namespaces. Contrast, for example, Nokogiri which lets you pass namespace info into an XPath query, or Microsoft with its XML Namespace Manager class. In other words, XPath does know about namespaces, but Apple gives you no direct way to tap into this part of its knowledge - a node knows about namespace nodes attached to *it*, and supplies these implicitly for any XPath queries performed on it (as you discovered) but that's all. This is just wrong. Your example is an excellent case in point. m.

On Mon, 07 Mar 2011 09:40:38 -0600, Heath Borders <email@hidden> said:
>That worked!
>
>I actually changed it to:
>
>nodesForXPath:@"/root/*[name() = \"example:foo\"]
>
>Thanks!
>
>-Heath Borders
>email@hidden
>Twitter: heathborders
>http://heath-tech.blogspot.com
>
>
>
>On Sat, Mar 5, 2011 at 2:27 PM, Matt Neuburg <email@hidden> wrote:
>> On Fri, 04 Mar 2011 14:25:06 -0600, Heath Borders <email@hidden> said:
>>>I'm trying to parse a document with a namespace declared on a non-root element:
>>>
>>><root><example:foo xmlns:example="http://example.com/foo";>This is an
>>>exemplary foo!</example:foo></root>
>>>
>>>I can read this xml into an NSXMLDocument just fine, but the following
>>>XPath query on root returns a non-nil, but empty NSArray:
>>>
>>>NSXMLNode *rootNode = ...// create my root node somehow
>>>NSArray *exampleFooElements = [rootNode
>>>nodesForXPath:@"/root/example:foo" error:nil];
>>>// exampleFooElements != nil && [exampleFooElements count] == 0
>>>
>>>However, if I add the namespace declaration to the root element,
>>>everything is fine:
>>>
>>><root xmlns:example="http://example.com/foo";><example:foo>This is an
>>>exemplary foo!</example:foo></root>
>>>
>>>NSXMLNode *rootNode = ...// create my root node somehow
>>>NSArray *exampleFooElements = [rootNode
>>>nodesForXPath:@"/root/example:foo" error:nil];
>>>// exampleFooElements != nil && [exampleFooElements count] == 1
>>>
>>>I can do this change programmatically, but I'd rather not have to
>>>modify the document. Â This namespace usage should be legal. Â Am I
>>>doing something wrong?
>>
>> It's no use just saying "example:"; you have to have a way to tell it what "example:" *is* - i.e. you have to bind the namespace - and you don't have a way to do that from here. One option is to bypass the namespace altogether:
>>
>>  nodesForXPath:@"//*[local-name()='foo']"
>>

--
matt neuburg, phd = email@hidden, <http://www.apeth.net/matt/>
A fool + a tool + an autorelease pool = cool!
Programming iOS 4!
http://www.apeth.net/matt/default.html#iosbook_______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden

  • Prev by Date: Re: Setting a delegate on a UITextField
  • Next by Date: Re: binding relationship to checkbox
  • Previous by thread: Re: XML Namespace Definitions on Non-Root Elements
  • Next by thread: Re: -[NSSet containsObject:] returns NO when it should return YES
  • Index(es):
    • Date
    • Thread