Using xPath to Search Entire xml file

ETL

Usenet Archive
Joined
Dec 29, 2004
Messages
5
Reaction score
0
Hi,
I have an xml document that feeds a treeview menu on my web site. The structure of the xml file is as follows.

<XML type="text/xml">
<root>
<a0 name="One">
<a0_0 html="Report 1" id="1" />
<a0_1 html="Report 2" id="2" />
<a0_2 html="Report 3" id="3" />
</a0>
<a1 name="Two">
<a1_0 html="Report 1" id="4" />
<a1_1 html="Report 2" id="5" />
<a1_2 html="Report 3" id="6" />
</a1>
<a2 name="Three">
<a2_1 name="Three_One">
<a2_1_1 html="Report 1" id="7" />
<a2_2_2 html="Report 2" id="8" />
</a2_1>
<a2_2 name="Three_Two">
<a2_2_1 html="Email Report 1" id="9" />
<a2_2_2 html="Email Report 2" id="10" />
<a2_2_3 html="Email Report 3" id="11" />
</a2_2>
</a2>
</root>
</XML>

I want to buld an asp.net application that takes in a node id attribute and returns the html attribute of the desired node. So if 11 were passed in it would return "Email Report 3".

I've found lots of xPath examples that search a straigh aligned xml file that doesn't have nested attributes but my file is more complex and includes tierded menu folders.

How can I search the entire document for the ID attribute.

One other thing, is there a difference in xPath quesries when using attribute or element based xml? Just curious.
Thanks for your help.

Regards

Eric
 

Martin Honnen

Usenet Archive
Joined
Apr 8, 2000
Messages
6,174
Reaction score
0
ETL wrote:

I have an xml document that feeds a treeview menu on my web site. The structure of the xml file is as follows.

<XML type="text/xml">
<root>
<a0 name="One">
<a0_0 html="Report 1" id="1" />
<a0_1 html="Report 2" id="2" />
<a0_2 html="Report 3" id="3" />
</a0>
<a1 name="Two">
<a1_0 html="Report 1" id="4" />
<a1_1 html="Report 2" id="5" />
<a1_2 html="Report 3" id="6" />
</a1>
<a2 name="Three">
<a2_1 name="Three_One">
<a2_1_1 html="Report 1" id="7" />
<a2_2_2 html="Report 2" id="8" />
</a2_1>
<a2_2 name="Three_Two">
<a2_2_1 html="Email Report 1" id="9" />
<a2_2_2 html="Email Report 2" id="10" />
<a2_2_3 html="Email Report 3" id="11" />
</a2_2>
</a2>
</root>
</XML>

I want to buld an asp.net application that takes in a node id attribute and returns the html attribute of the desired node. So if 11 were passed in it would return "Email Report 3".

Having the nesting level encoded in the element name is a pretty odd way and will cause you a lot of trouble I think. The XPath could be //*[@id = '11']/@html
 

Joris Gillis

Usenet Archive
Joined
Sep 28, 2004
Messages
355
Reaction score
0
I want to buld an asp.net application that takes in a node id attribute
and returns the html attribute of the desired node. So if 11 were passed in it would return "Email Report 3".

Having the nesting level encoded in the element name is a pretty odd way and will cause you a lot of trouble I think. The XPath could be //*[@id = '11']/@html

Maybe you could use the DOM function 'getElementById' instead of an Xpath expression?
 

ETL

Usenet Archive
Joined
Dec 29, 2004
Messages
5
Reaction score
0
Joris said:
I want to buld an asp.net application that takes in a node id attribute and returns the html attribute of the desired node. So if 11 were passed in it would return "Email Report 3".

Having the nesting level encoded in the element name is a pretty odd way and will cause you a lot of trouble I think. The XPath could be //*[@id = '11']/@html

Maybe you could use the DOM function 'getElementById' instead of an Xpath expression?

I'm not so sure that the 'getElementById' format works for nested nodes. All the exmples I found for this used simple one dimensional XML documents.
 

ETL

Usenet Archive
Joined
Dec 29, 2004
Messages
5
Reaction score
0
Joris said:
I want to buld an asp.net application that takes in a node id attribute and returns the html attribute of the desired node. So if 11 were passed in it would return "Email Report 3".

Having the nesting level encoded in the element name is a pretty odd way and will cause you a lot of trouble I think. The XPath could be //*[@id = '11']/@html

Maybe you could use the DOM function 'getElementById' instead of an Xpath expression?

I'm not so sure that the 'getElementById' format works for nested nodes. All the exmples I found for this used simple one dimensional XML documents.
 

Martin Honnen

Usenet Archive
Joined
Apr 8, 2000
Messages
6,174
Reaction score
0
Joris said:
Having the nesting level encoded in the element name is a pretty odd way and will cause you a lot of trouble I think. The XPath could be //*[@id = '11']/@html

Maybe you could use the DOM function 'getElementById' instead of an Xpath expression?

If you want to use getElementById then the document needs a DTD that defines that the attributes of name id are of type ID. The original example doesn't have a DTD. And with those element names encoding nesting levels the DTD would need to be adjusted every time the nesting level of the XML increases.
 

Joris Gillis

Usenet Archive
Joined
Sep 28, 2004
Messages
355
Reaction score
0
If you want to use getElementById then the document needs a DTD that
defines that the attributes of name id are of type ID.
I'll try not to make that mistake again...
The original example doesn't have a DTD. And with those element names encoding nesting levels the DTD would need to be adjusted every time the nesting level of the XML increases.

Is it really necessary to define the whole DTD? Can one not specify the attribute that is of type ID without including any other document definition? (note that I've never used DTD, XML Schema or RelaxNG)

regards,
 

Martin Honnen

Usenet Archive
Joined
Apr 8, 2000
Messages
6,174
Reaction score
0
Joris said:
Is it really necessary to define the whole DTD? Can one not specify the attribute that is of type ID without including any other document definition?

With a DTD you need to define the attribute for each element you want to use it on. I am not sure what is supposed to happen if you do not define the elements but then specify attributes but it is certainly not reliable thing to do. In my tests here with MSXML 3 and with .NET XmlDocument elements are not found by id (using the nodeFromID function in MSXML and GetElementById with .NET) if only attributes are defined. Mozilla with getElementById finds the elements if only the attributes are defined. But Mozilla only processes internal subsets of DTDs so in many cases you can't rely on ID attributes and getElementById.

There is a new W3C recommendation for the xml:id attribute <http://www.w3.org/TR/xml-id/> if that is going to be implemented then no DTD should be required to make use of getElementById.
 

ETL

Usenet Archive
Joined
Dec 29, 2004
Messages
5
Reaction score
0
Joris said:
That sounds really interesting. I hope it will soon become a recommendation...

lame....it's looking like GetElementByID is going to be too much overhead for this application. I don't want to have to maintain a DTD for this. Back to xPath solution I guess.....
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
548,042
Messages
3,104,224
Members
248,132
Latest member
henrywalsh

Latest Threads

Top