--- type: "doc" source: "source/xml.html" --- \[%settitle XML Format%\] \[%file newheader%\] \[%file newnavbar%\] <%fmtheader xml%> ## XML Representation of Resources | Responsible Owner: [\[%wgt its%\]]([%wg its%]) Work Group | [Standards Status](versions#std-process):[Normative](versions#std-process) | | --- | --- | The XML representation for a resource is described using this format: <**name** xmlns="http://hl7.org/fhir" (attrA="value") [resourceDefinition](#additional)\="{canonical}"> [![doco](help.png)](xml "Documentation for this format") <**nameA**\> <**nameB\[x\]**\> <**nameC**\> <**nameD**\> Using this format: - The name at the root is the name of the resource type, and is either a resource type defined in this specification, or as [explained below](#additional) - To build a valid XML instance of a resource, simply replace the contents of the elements and attributes with valid content as described by the cardinality, type rules and content description found in the comment in each element - Resource and Element names are case-sensitive (though duplicates that differ only in case are never defined) - Elements must always appear in the order documented - When an element is allowed to repeat, the elements are ordered, and the technical infrastructure needs to be able to access the items in the right order (see also [Cardinality Rules](conformance-rules#cardinality) for a further description of elements with cardinality > 1) - A few properties are represented as attributes: values of primitive types in a `value` attribute, extension URLs in the `url` attribute on an extension, and the `id` property on elements (but not on resources, where the resource id is an element) - Any of the XML elements may have an id attribute to serve as [the target of an internal reference](narrative#internal). The id attribute is not shown in this format - FHIR elements are always in the namespace [http://hl7.org/fhir](http://hl7.org/fhir). This is usually specified as the default namespace on the root element. The only other namespace that occurs in FHIR resources is the XHTML namespace - [XHTML is found in most resources](narrative) - Infrastructural elements must appear prior to any other defined child elements in the following order: - First, the elements from the [base resource](resource), in order - Second, the elements from the [domain resource](domainresource), in order - FHIR elements are never empty. If an element is present in the resource, it SHALL have either a value attribute, child elements as defined for its type, or 1 or more [extensions](extensibility) - Attributes cannot be empty. Either they are absent, or they are present with at least one character of non-whitespace content - Implementers SHOULD trim leading and trailing whitespace before writing and SHOULD trim leading and trailing whitespace when reading attribute values (for XML schema conformance) - The lock icon (![??](lock.png)) denotes that an element defines or is affected by [additional rules](conformance-rules#constraints) that control its presence and/or content - XML comments, processing instructions and formatting are not part of the contents of a resource - There SHALL be no DTD references in FHIR resources (because of the [XXE security exploit](https://en.wikipedia.org/wiki/XML_external_entity_attack)) - XML resources SHALL be exchanged using UTF-8 encoding. Specifying the character encoding using an XML declaration (``) is optional but recommended - Other processing instructions SHOULD not be included and SHALL NOT be required to properly understand and/or present the data or narrative of the resource. Applications MAY preserve processing instructions when handling resources, but are not required to do so - The MIME-type for this format is `application/fhir+xml`. This page contains some JSON examples for the purposes of comparison between the two formats. The formats page has a [comparison between the XML and JSON formats](resource-formats#comparison). ### XML representation of additional resources When [additional resources](resource#additional) are represented in XML, the base document name is the name of the resource as allocated by HL7, the namespace is the normal FHIR namespace, and an additional attribute is present, `resourceDefinition`. The resourceDefinition value contains a canonical reference to the definition of the resource and always includes the version explicitly, e.g., // etc The `resourceDefinition` attribute is a feature of the XML format, and is not defined anywhere in the structural definitions of FHIR (in the same way that the base name is not). The resourceDefinition attribute is not present if the resource is one defined in this specification. Also, see note about the schema and additional resources below. ### XML Representation for repeating elements An element that has a maximum cardinality of >1 (e.g., `x..*` in the definitions) may occur more than once in the instance. In XML, this is simply done by repeating the XML element multiple times. So a [CodeableConcept](datatypes#CodeableConcept) is represented in XML like this: For comparison, In JSON, this is done by using an array type, also using the singular name: { "coding": \[ { "system" : "http://snomed.info/sct", "code" : "104934005" }, { "system" : "http://loinc.org", "code" : "2947-0" } \] } ### XML representation of primitive elements FHIR elements with primitive datatypes are represented in by an XML element with a value attribute. <**code** value="abc"/> <**date** value="1972-11-30"/> <**deceased** value="false" /> <**count** value="23" /> For comparison, this is represented in JSON as "code" : "abc", "date" : "1972-11-30", "deceased" : false, "count" : 23 If the value has an id attribute, or extensions, then these are represented as follows: <**birthDate** id="314159" value="1970-03-30" > The JSON representation is more complex: "birthDate": "1970-03-30", "\_birthDate": { "id": "314159", "extension" : \[ { "url" : "http://example.org/fhir/StructureDefinition/text", "valueString" : "Easter 1970" }\] } ### XML representation of Complex Datatypes and XHTML Complex [datatypes](datatypes) (types that contain named elements of other types) are represented using an element that containing an element for each element in the datatype. Complex datatypes can have ids, which are represented as id attributes, in the same manner as described for primitives. For example:

...

For comparison, this is represented in JSON as: { "resourceType" : "Patient", "name" : \[{ "id" : "f2", "use" : "official" , "given" : \[ "Karen" \], "family" : "Van", "\_family" : {"id" : "a2"} }\], "text" : { "status" : "generated" , "div" : "

...

" } } Things to note here are: - All elements are in the `http://hl7.org/fhir` namespace, except for the XHTML content - The XHTML content in the `div` element which is in the Narrative element `text` is represented directly as xhtml, with a root
element in the xhtml namespace ### XML Schema and Schematron This specification provides schema definitions for all the resource and datatype content models it describes. The base schema is called "[fhir-base.xsd](fhir-base.xsd)" and defines all the datatypes and base infrastructure types. In addition, there is a schema for each resource and a common schema [fhir-all.xsd](fhir-all.xsd) that includes all the resource schemas. For schema processors that do not like circular includes, there is [a single schema](fhir-single.xsd) that contains everything. The base schema only describes the resources defined in this specification; additional resources are not included in the schema. If enough implementers identify a need for this, HL7 may choose to provide a tool that stitches a new schema for a given set of additional resources. In addition to the w3c schema files, this specification also provides Schematron files that enforce most of the constraints defined for the datatypes and resources, though some are only expressible and validatable using [FHIRPath](fhirpath). These are packaged as files for each resource. XML that is exchanged SHALL be valid against the w3c schema and Schematron, though being valid against the schema and Schematron is not sufficient to be a conformant instance: this specification makes several rules that cannot be checked by either mechanism. Operational systems may choose to use schema tools to check validation, but are not required to do so. Exchanged content SHALL NOT specify the schema or even contain the schema instance namespace in the resource itself. Given the way [extensions](extensibility) work, applications reading XML resources will never encounter unknown elements. However, once an application starts trading with other applications that conform to later versions of this specification, unknown XML elements may be encountered. Applications MAY choose to ignore unknown elements to foster forwards compatibility in this regard, but may also choose not to - which would be the normal behavior for schema generated applications. ### Code Generation Schema In addition to the validation schema, this specification provides a set of schemas suitable for code generation. These schemas describe the same XML syntax, but apply less validation to create schemas that work better with code generation tooling. Specifically, these schemas are generated without any `xsd:choice` elements, for code generators that don't deal with choices well. Implementers that use these schemas will need to enforce the correct usage of the [choice elements](formats#choice) without schema support. Implementers making use of schema-driven code generation tooling need to consider how to handle the [decimal](datatypes#decimal) datatype. The decimal datatype is defined to be precision aware - that is, that implementers need to preserve the difference between "2.0" and "2.00" - this is ubiquitously considered important in handling observed data in healthcare. Both schemas map this datatype to a union of `xsd:decimal` and `xsd:double`, but the base [W3C schema decimal type](http://www.w3.org/TR/xmlschema-2/#decimal) is specified not to be precision aware. Schema driven implementations vary as to how precision is handled. Implementers will need to determine how their generated code handles decimals/doubles and consider changing the type for decimal in their schema from `xsd:decimal/double` to `xsd:string`. Specifically, implementers may wish to change: to this: Note that most code generation frameworks ignore the pattern restriction. ### Canonical XML See [Signatures](signatures#xml) for details. \[%file newfooter%\]