• Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
    Dedicated community for Japanese speakers
  • 한국 커뮤니티
    Dedicated community for Korean speakers
Exit
0

Maintain attribute order in XML with a structure?

New Here ,
Dec 05, 2011 Dec 05, 2011

Copy link to clipboard

Copied

I'm using xmlParse() to read an XML file into a structure, and then process the structure (replace some of the XML attributes) and then write the structure back out as an XML file. The problem is that I loose the original ordering of XML attrbutes when I convert to a structure, and instead end up with a new attribute order for each element that is alphabetical.

In otherwords: <element c="text" d="text" a="text" />

gets rewritten as: <element a="text" c="text" d="text" />

which is a problem for this application.

Is there a way to work with XML in CF but maintain attribute ordering (LinkedHashMap instead of a structure, maybe)?

Thanks.

Walter

TOPICS
Advanced techniques

Views

8.2K

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines

correct answers 1 Correct answer

LEGEND , Dec 06, 2011 Dec 06, 2011

If you need to control the order of the attributes, you'll need to write your xml out by hand... according to the XML specification, attribute ordering must not be significant, so strictly-speaking your requirement here requires something of XML that's contrary to its intent.  And, accordingly, there's no way of making CF respect something that's intrinsically not supposed to be respected.

NB: "I'm using xmlParse() to read an XML file into a structure,"... xmlParse() creates an XML object, not a

...

Votes

Translate

Translate
LEGEND ,
Dec 06, 2011 Dec 06, 2011

Copy link to clipboard

Copied

If you need to control the order of the attributes, you'll need to write your xml out by hand... according to the XML specification, attribute ordering must not be significant, so strictly-speaking your requirement here requires something of XML that's contrary to its intent.  And, accordingly, there's no way of making CF respect something that's intrinsically not supposed to be respected.

NB: "I'm using xmlParse() to read an XML file into a structure,"... xmlParse() creates an XML object, not a struct, so what you're asking in your last para doesn't really make sense.  xmlParse() will only create an XML object. If you want to read the XML data as something other than XML, you'll need to write your own function.

The best solution here, if poss, is to remove the significance of the attribute order in your app, because it's "wrong" to infer any ordering, and you're making a bit of a logical rod for your own back in relying on this ordering.

Not a "just do it like this" response, sorry, but that's what one gets when the question is submerged in a can of worms... 😉

--
Adam

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Dec 06, 2011 Dec 06, 2011

Copy link to clipboard

Copied

Thanks, Adam. I totally agree. Attribute ordering may not even be an issue for this application, but using ColdFusion to process XML in this way is making a pretty big change in the XML structure. It's that change that has me concerned. So far everything works fine with attribute reordering. But then it's a huge application in its last stage of development before GA release, and it's too risky to make the XML files "look" so different at this point. So I found I can work around using a structure and instead treat them as textual files and use find/replace for those attributes I need to revise. Hopefully next time, I'll be onboard earlier in the project development cycle so there is time to confirm that everything is well behaved.

Walter

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
LEGEND ,
Dec 07, 2011 Dec 07, 2011

Copy link to clipboard

Copied

but using ColdFusion to process XML in this way is making a pretty big change in the XML structure.

No, it's not changing the structure in any meaningful way: the attribute ordering isn't meaningful in XML, so if the order of them changes, then that's not a meaningful change.  In any way that XML should be used, it doesn't matter.

When CF reads an string (like file contents) and parses it as XML, it needs to create an XML object; that XML object will adhere to the rules of XML; one of which is "atribute order has no significance", so it will not (and ought not) bother to "remember" the order that the attributes were in in the original string.  When one converts that object back into a string, some sort of ordering needs to be used to write them back, and CF seems to arbitrarily use alphabetical order.  But it cannot refer back to information that it doesn't have (the original ordering), so the original ordering can't be preserved.

There's nothing unreasonable or that shouldn't be expected in this process, unfortunately (for you, I mean).

--

Adam

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Mar 14, 2012 Mar 14, 2012

Copy link to clipboard

Copied

I'm having a very similar problem, except in my case if for human readability.  I have a property called number, and it would be nice if that was displayed first, and not alphabetically towards the end of the list of properties.  Just hard to double check everything on screen when the order is all moved around when using <CFXML>

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Guide ,
Mar 14, 2012 Mar 14, 2012

Copy link to clipboard

Copied

As has been mentioned, it's just not how XML works. Does XSLT allow for ordering?

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Mar 14, 2012 Mar 14, 2012

Copy link to clipboard

Copied

I understand that, but it only seems to be a problem with coldfusion.  Like our vendor can send us an XML feed and the attributes in it are not order alphabetically so it makes it really easy to read.  But when I send back the same feed with updated info all the parameters are moved around alphabetically.  Everything still works, so that's not the issue, but during testing it's just really hard to read and compare the feeds.  I thought the whole original purpose behind XML was to make a format that allowed for easy data sharing that was easily human readable.  Oh well, hopefully they can add some attribute in CF10 to say don't change the order that's explicitly specified when the XML is created.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Guide ,
Mar 14, 2012 Mar 14, 2012

Copy link to clipboard

Copied

hopefully they can add some attribute in CF10 to say don't change the order that's explicitly specified when the XML is created.

It would appear not.

I'd be surprised if anyone made a change like that, as it's not a requirement of XML it's more that your other systems "happen" to display them in order; they equally could not and still be valid. XML was never meant to be displayed as such, and as far as I know it's only human-readable as a by-product of it being a text-based standard; I'm not sure this was so it could be "easily read" by people.

Generally you'd parse the XML and display it in your own format, so ordering wouldn't be an issue.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Mar 14, 2012 Mar 14, 2012

Copy link to clipboard

Copied

LATEST

Ah, found a solution on another thread.  Using CFSAVECONTENT instead of CFXML totally resolved this issue for me.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Resources
Documentation