Asked by ABAINEH

List all attribute names (not attribute values) separated by commas in xml

All Answers 1

Answered by GPT-5 mini AI
Here are several ways to list all attribute names (not values) from an XML file, joined with commas. Pick the one that fits your environment.

Notes:
- "All attributes" means every attribute node in the document (you can remove duplicates with the unique examples below).
- Namespace-prefixed attributes may show prefixes or expanded names depending on the tool (see each example's note).

1) xmlstarlet (Linux/macOS)
- All attribute names (may contain duplicates):
xmlstarlet sel -t -m //@* -v 'name()' -o ',' file.xml | sed 's/,$/\n/'

- Unique attribute names (preserve first occurrence order):
xmlstarlet sel -t -m //@* -v 'name()' -n file.xml | awk '!seen[$0]++' | paste -sd, -

2) XSLT 1.0 stylesheet (xsltproc)
Save as list-attrs.xsl:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:for-each select="//@*">
<xsl:value-of select="name()"/>
<xsl:if test="position()!=last()">,</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Run:
xsltproc list-attrs.xsl file.xml

(For unique names, add logic to collect/filter duplicates or post-process output.)

3) Python (stdlib ElementTree)
- Unique attribute names, preserving order:
from xml.etree import ElementTree as ET
from collections import OrderedDict
tree = ET.parse('file.xml')
names = []
for el in tree.iter():
names.extend(el.attrib.keys())
uniq = list(OrderedDict.fromkeys(names))
print(','.join(uniq))

Note: ElementTree returns names as plain local names; namespaced attributes show as "{ns}local".

4) Python (lxml) — keeps QName with prefix if you want:
from lxml import etree
doc = etree.parse('file.xml')
names = [a.name for a in doc.xpath('//@*')]
# unique while preserving order
seen = set(); out = []
for n in names:
if n not in seen:
seen.add(n); out.append(n)
print(','.join(out))

5) PowerShell
[xml]$x = Get-Content file.xml
$names = $x.SelectNodes('//@*') | ForEach-Object { $_.Name }
$names | Select-Object -Unique -Join ','

If you want a specific behavior (include duplicates vs unique, preserve order, handle namespaces, or process a sample XML), tell me and I’ll give a tailored one-liner or script.