Re: XML Namespace Definitions on Non-Root Elements
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