yq/pkg/yqlib/doc/usage/xml.md
Mike Farah 6bcbd873a6 wip
2021-12-21 16:19:27 +11:00

2.5 KiB

XML

At the moment, yq only supports decoding xml (into one of the other supported output formats).

As yaml does not have the concept of attributes, these are converted to regular fields with a prefix to prevent clobbering. Consecutive xml nodes with the same name are assumed to be arrays.

All values in XML are assumed to be strings - but you can use from_yaml to parse them into their correct types:

yq e -p=xml '.myNumberField |= from_yaml' my.xml

Parse xml: simple

Given a sample.xml file of:

<?xml version="1.0" encoding="UTF-8"?>
<cat>meow</cat>

then

yq e -p=xml '.' sample.xml

will output

cat: meow

Parse xml: array

Consecutive nodes with identical xml names are assumed to be arrays.

Given a sample.xml file of:

<?xml version="1.0" encoding="UTF-8"?>
<animal>1</animal>
<animal>2</animal>

then

yq e -p=xml '.' sample.xml

will output

animal:
  - "1"
  - "2"

Parse xml: attributes

Attributes are converted to fields, with the attribute prefix.

Given a sample.xml file of:

<?xml version="1.0" encoding="UTF-8"?>
<cat legs="4">
  <legs>7</legs>
</cat>

then

yq e -p=xml '.' sample.xml

will output

cat:
  +legs: "4"
  legs: "7"

Parse xml: attributes with content

Content is added as a field, using the content name

Given a sample.xml file of:

<?xml version="1.0" encoding="UTF-8"?>
<cat legs="4">meow</cat>

then

yq e -p=xml '.' sample.xml

will output

cat:
  +content: meow
  +legs: "4"

Encode xml: simple

Given a sample.yml file of:

cat: purrs

then

yq e -o=xml '.' sample.yml

will output

<cat>purrs</cat>

Encode xml: array

Given a sample.yml file of:

pets:
  cat:
    - purrs
    - meows

then

yq e -o=xml '.' sample.yml

will output

<pets>
  <cat>purrs</cat>
  <cat>meows</cat>
</pets>

Encode xml: attributes

Fields with the matching xml-attribute-prefix are assumed to be attributes.

Given a sample.yml file of:

cat:
  +name: tiger
  meows: true

then

yq e -o=xml '.' sample.yml

will output

<cat name="tiger">
  <meows>true</meows>
</cat>

Encode xml: attributes with content

Fields with the matching xml-content-name is assumed to be content.

Given a sample.yml file of:

cat:
  +name: tiger
  +content: cool

then

yq e -o=xml '.' sample.yml

will output

<cat name="tiger">cool</cat>