/*** Autogenerated by WIDL 10.0-rc1 from include/windows.data.xml.dom.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __windows_data_xml_dom_h__
#define __windows_data_xml_dom_h__

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity ABI::Windows::Data::Xml::Dom::IDtdEntity
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IDtdEntity;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation ABI::Windows::Data::Xml::Dom::IDtdNotation
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IDtdNotation;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute ABI::Windows::Data::Xml::Dom::IXmlAttribute
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlAttribute;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection ABI::Windows::Data::Xml::Dom::IXmlCDataSection
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlCDataSection;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData ABI::Windows::Data::Xml::Dom::IXmlCharacterData
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlCharacterData;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment ABI::Windows::Data::Xml::Dom::IXmlComment
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlComment;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument ABI::Windows::Data::Xml::Dom::IXmlDocument
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlDocument;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment ABI::Windows::Data::Xml::Dom::IXmlDocumentFragment
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlDocumentFragment;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO ABI::Windows::Data::Xml::Dom::IXmlDocumentIO
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlDocumentIO;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 ABI::Windows::Data::Xml::Dom::IXmlDocumentIO2
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlDocumentIO2;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics ABI::Windows::Data::Xml::Dom::IXmlDocumentStatics
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlDocumentStatics;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType ABI::Windows::Data::Xml::Dom::IXmlDocumentType
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlDocumentType;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation ABI::Windows::Data::Xml::Dom::IXmlDomImplementation
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlDomImplementation;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement ABI::Windows::Data::Xml::Dom::IXmlElement
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlElement;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference ABI::Windows::Data::Xml::Dom::IXmlEntityReference
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlEntityReference;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings ABI::Windows::Data::Xml::Dom::IXmlLoadSettings
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlLoadSettings;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap ABI::Windows::Data::Xml::Dom::IXmlNamedNodeMap
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlNamedNodeMap;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode ABI::Windows::Data::Xml::Dom::IXmlNode
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlNode;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList ABI::Windows::Data::Xml::Dom::IXmlNodeList
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlNodeList;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector ABI::Windows::Data::Xml::Dom::IXmlNodeSelector
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlNodeSelector;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer ABI::Windows::Data::Xml::Dom::IXmlNodeSerializer
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlNodeSerializer;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction ABI::Windows::Data::Xml::Dom::IXmlProcessingInstruction
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlProcessingInstruction;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlText_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlText_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlText __x_ABI_CWindows_CData_CXml_CDom_CIXmlText;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlText ABI::Windows::Data::Xml::Dom::IXmlText
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlText;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CDtdEntity_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CDtdEntity_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    class DtdEntity;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CDtdEntity __x_ABI_CWindows_CData_CXml_CDom_CDtdEntity;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CDtdEntity_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CDtdNotation_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CDtdNotation_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    class DtdNotation;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CDtdNotation __x_ABI_CWindows_CData_CXml_CDom_CDtdNotation;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CDtdNotation_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlAttribute_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlAttribute_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    class XmlAttribute;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlAttribute __x_ABI_CWindows_CData_CXml_CDom_CXmlAttribute;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlAttribute_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlCDataSection_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlCDataSection_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    class XmlCDataSection;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlCDataSection __x_ABI_CWindows_CData_CXml_CDom_CXmlCDataSection;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlCDataSection_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlComment_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlComment_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    class XmlComment;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlComment __x_ABI_CWindows_CData_CXml_CDom_CXmlComment;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlComment_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlDocument_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlDocument_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    class XmlDocument;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlDocument __x_ABI_CWindows_CData_CXml_CDom_CXmlDocument;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlDocument_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlDocumentFragment_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlDocumentFragment_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    class XmlDocumentFragment;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlDocumentFragment __x_ABI_CWindows_CData_CXml_CDom_CXmlDocumentFragment;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlDocumentFragment_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlDocumentType_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlDocumentType_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    class XmlDocumentType;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlDocumentType __x_ABI_CWindows_CData_CXml_CDom_CXmlDocumentType;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlDocumentType_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlDomImplementation_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlDomImplementation_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    class XmlDomImplementation;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlDomImplementation __x_ABI_CWindows_CData_CXml_CDom_CXmlDomImplementation;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlDomImplementation_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlElement_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlElement_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    class XmlElement;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlElement __x_ABI_CWindows_CData_CXml_CDom_CXmlElement;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlElement_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlEntityReference_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlEntityReference_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    class XmlEntityReference;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlEntityReference __x_ABI_CWindows_CData_CXml_CDom_CXmlEntityReference;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlEntityReference_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlLoadSettings_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlLoadSettings_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    class XmlLoadSettings;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlLoadSettings __x_ABI_CWindows_CData_CXml_CDom_CXmlLoadSettings;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlLoadSettings_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlNamedNodeMap_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlNamedNodeMap_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    class XmlNamedNodeMap;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlNamedNodeMap __x_ABI_CWindows_CData_CXml_CDom_CXmlNamedNodeMap;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlNamedNodeMap_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlNodeList_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlNodeList_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    class XmlNodeList;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlNodeList __x_ABI_CWindows_CData_CXml_CDom_CXmlNodeList;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlNodeList_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlProcessingInstruction_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlProcessingInstruction_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    class XmlProcessingInstruction;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlProcessingInstruction __x_ABI_CWindows_CData_CXml_CDom_CXmlProcessingInstruction;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlProcessingInstruction_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlText_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlText_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    class XmlText;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlText __x_ABI_CWindows_CData_CXml_CDom_CXmlText;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlText_FWD_DEFINED__ */

#ifndef ____FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
#define ____FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Data::Xml::Dom::IXmlNode* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
#define ____FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Data::Xml::Dom::IXmlNode* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Data::Xml::Dom::IXmlNode* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Data::Xml::Dom::XmlDocument* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Data::Xml::Dom::XmlDocument* >
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <inspectable.h>
#include <asyncinfo.h>
#include <eventtoken.h>
#include <windowscontracts.h>
#include <windows.foundation.h>
#include <windows.storage.h>
#include <windows.storage.streams.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CData_CXml_CDom_CNodeType __x_ABI_CWindows_CData_CXml_CDom_CNodeType;
#endif /* __cplusplus */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity ABI::Windows::Data::Xml::Dom::IDtdEntity
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IDtdEntity;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation ABI::Windows::Data::Xml::Dom::IDtdNotation
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IDtdNotation;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute ABI::Windows::Data::Xml::Dom::IXmlAttribute
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlAttribute;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection ABI::Windows::Data::Xml::Dom::IXmlCDataSection
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlCDataSection;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData ABI::Windows::Data::Xml::Dom::IXmlCharacterData
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlCharacterData;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment ABI::Windows::Data::Xml::Dom::IXmlComment
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlComment;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument ABI::Windows::Data::Xml::Dom::IXmlDocument
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlDocument;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment ABI::Windows::Data::Xml::Dom::IXmlDocumentFragment
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlDocumentFragment;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO ABI::Windows::Data::Xml::Dom::IXmlDocumentIO
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlDocumentIO;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 ABI::Windows::Data::Xml::Dom::IXmlDocumentIO2
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlDocumentIO2;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics ABI::Windows::Data::Xml::Dom::IXmlDocumentStatics
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlDocumentStatics;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType ABI::Windows::Data::Xml::Dom::IXmlDocumentType
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlDocumentType;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation ABI::Windows::Data::Xml::Dom::IXmlDomImplementation
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlDomImplementation;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement ABI::Windows::Data::Xml::Dom::IXmlElement
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlElement;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference ABI::Windows::Data::Xml::Dom::IXmlEntityReference
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlEntityReference;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings ABI::Windows::Data::Xml::Dom::IXmlLoadSettings
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlLoadSettings;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap ABI::Windows::Data::Xml::Dom::IXmlNamedNodeMap
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlNamedNodeMap;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode ABI::Windows::Data::Xml::Dom::IXmlNode
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlNode;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList ABI::Windows::Data::Xml::Dom::IXmlNodeList
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlNodeList;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector ABI::Windows::Data::Xml::Dom::IXmlNodeSelector
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlNodeSelector;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer ABI::Windows::Data::Xml::Dom::IXmlNodeSerializer
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlNodeSerializer;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction ABI::Windows::Data::Xml::Dom::IXmlProcessingInstruction
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlProcessingInstruction;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlText_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlText_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlText __x_ABI_CWindows_CData_CXml_CDom_CIXmlText;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlText ABI::Windows::Data::Xml::Dom::IXmlText
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlText;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
#define ____FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Data::Xml::Dom::IXmlNode* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
#define ____FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Data::Xml::Dom::IXmlNode* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Data::Xml::Dom::IXmlNode* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Data::Xml::Dom::XmlDocument* >
#endif /* __cplusplus */
#endif

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    enum NodeType {
                        NodeType_Invalid = 0,
                        NodeType_ElementNode = 1,
                        NodeType_AttributeNode = 2,
                        NodeType_TextNode = 3,
                        NodeType_DataSectionNode = 4,
                        NodeType_EntityReferenceNode = 5,
                        NodeType_EntityNode = 6,
                        NodeType_ProcessingInstructionNode = 7,
                        NodeType_CommentNode = 8,
                        NodeType_DocumentNode = 9,
                        NodeType_DocumentTypeNode = 10,
                        NodeType_DocumentFragmentNode = 11,
                        NodeType_NotationNode = 12
                    };
                }
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CData_CXml_CDom_CNodeType {
    NodeType_Invalid = 0,
    NodeType_ElementNode = 1,
    NodeType_AttributeNode = 2,
    NodeType_TextNode = 3,
    NodeType_DataSectionNode = 4,
    NodeType_EntityReferenceNode = 5,
    NodeType_EntityNode = 6,
    NodeType_ProcessingInstructionNode = 7,
    NodeType_CommentNode = 8,
    NodeType_DocumentNode = 9,
    NodeType_DocumentTypeNode = 10,
    NodeType_DocumentFragmentNode = 11,
    NodeType_NotationNode = 12
};
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define NodeType __x_ABI_CWindows_CData_CXml_CDom_CNodeType
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
/*****************************************************************************
 * IDtdEntity interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity, 0x6a0b5ffc, 0x63b4, 0x480f, 0x9e,0x6a, 0x8a,0x92,0x81,0x6a,0xad,0xe4);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("6a0b5ffc-63b4-480f-9e6a-8a92816aade4")
                    IDtdEntity : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_PublicId(
                            IInspectable **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_SystemId(
                            IInspectable **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_NotationName(
                            IInspectable **value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity, 0x6a0b5ffc, 0x63b4, 0x480f, 0x9e,0x6a, 0x8a,0x92,0x81,0x6a,0xad,0xe4)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntityVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity *This,
        TrustLevel *trustLevel);

    /*** IDtdEntity methods ***/
    HRESULT (STDMETHODCALLTYPE *get_PublicId)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity *This,
        IInspectable **value);

    HRESULT (STDMETHODCALLTYPE *get_SystemId)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity *This,
        IInspectable **value);

    HRESULT (STDMETHODCALLTYPE *get_NotationName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity *This,
        IInspectable **value);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntityVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntityVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDtdEntity methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_get_PublicId(This,value) (This)->lpVtbl->get_PublicId(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_get_SystemId(This,value) (This)->lpVtbl->get_SystemId(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_get_NotationName(This,value) (This)->lpVtbl->get_NotationName(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_Release(__x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDtdEntity methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_get_PublicId(__x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity* This,IInspectable **value) {
    return This->lpVtbl->get_PublicId(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_get_SystemId(__x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity* This,IInspectable **value) {
    return This->lpVtbl->get_SystemId(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_get_NotationName(__x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity* This,IInspectable **value) {
    return This->lpVtbl->get_NotationName(This,value);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IDtdEntity IID___x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity
#define IDtdEntityVtbl __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntityVtbl
#define IDtdEntity __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity
#define IDtdEntity_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_QueryInterface
#define IDtdEntity_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_AddRef
#define IDtdEntity_Release __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_Release
#define IDtdEntity_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_GetIids
#define IDtdEntity_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_GetRuntimeClassName
#define IDtdEntity_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_GetTrustLevel
#define IDtdEntity_get_PublicId __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_get_PublicId
#define IDtdEntity_get_SystemId __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_get_SystemId
#define IDtdEntity_get_NotationName __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_get_NotationName
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDtdNotation interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation, 0x8cb4e04d, 0x6d46, 0x4edb, 0xab,0x73, 0xdf,0x83,0xc5,0x1a,0xd3,0x97);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("8cb4e04d-6d46-4edb-ab73-df83c51ad397")
                    IDtdNotation : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_PublicId(
                            IInspectable **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_SystemId(
                            IInspectable **value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation, 0x8cb4e04d, 0x6d46, 0x4edb, 0xab,0x73, 0xdf,0x83,0xc5,0x1a,0xd3,0x97)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation *This,
        TrustLevel *trustLevel);

    /*** IDtdNotation methods ***/
    HRESULT (STDMETHODCALLTYPE *get_PublicId)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation *This,
        IInspectable **value);

    HRESULT (STDMETHODCALLTYPE *get_SystemId)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation *This,
        IInspectable **value);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotationVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDtdNotation methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_get_PublicId(This,value) (This)->lpVtbl->get_PublicId(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_get_SystemId(This,value) (This)->lpVtbl->get_SystemId(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_Release(__x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDtdNotation methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_get_PublicId(__x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation* This,IInspectable **value) {
    return This->lpVtbl->get_PublicId(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_get_SystemId(__x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation* This,IInspectable **value) {
    return This->lpVtbl->get_SystemId(This,value);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IDtdNotation IID___x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation
#define IDtdNotationVtbl __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotationVtbl
#define IDtdNotation __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation
#define IDtdNotation_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_QueryInterface
#define IDtdNotation_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_AddRef
#define IDtdNotation_Release __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_Release
#define IDtdNotation_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_GetIids
#define IDtdNotation_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_GetRuntimeClassName
#define IDtdNotation_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_GetTrustLevel
#define IDtdNotation_get_PublicId __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_get_PublicId
#define IDtdNotation_get_SystemId __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_get_SystemId
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlAttribute interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute, 0xac144aa4, 0xb4f1, 0x4db6, 0xb2,0x06, 0x8a,0x22,0xc3,0x08,0xdb,0x0a);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("ac144aa4-b4f1-4db6-b206-8a22c308db0a")
                    IXmlAttribute : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_Name(
                            HSTRING *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_Specified(
                            boolean *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_Value(
                            HSTRING *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_Value(
                            HSTRING value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute, 0xac144aa4, 0xb4f1, 0x4db6, 0xb2,0x06, 0x8a,0x22,0xc3,0x08,0xdb,0x0a)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttributeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *This,
        TrustLevel *trustLevel);

    /*** IXmlAttribute methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Name)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Specified)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_Value)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_Value)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *This,
        HSTRING value);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttributeVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttributeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlAttribute methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_get_Name(This,value) (This)->lpVtbl->get_Name(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_get_Specified(This,value) (This)->lpVtbl->get_Specified(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_put_Value(This,value) (This)->lpVtbl->put_Value(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlAttribute methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_get_Name(__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute* This,HSTRING *value) {
    return This->lpVtbl->get_Name(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_get_Specified(__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute* This,boolean *value) {
    return This->lpVtbl->get_Specified(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_get_Value(__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute* This,HSTRING *value) {
    return This->lpVtbl->get_Value(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_put_Value(__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute* This,HSTRING value) {
    return This->lpVtbl->put_Value(This,value);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlAttribute IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute
#define IXmlAttributeVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttributeVtbl
#define IXmlAttribute __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute
#define IXmlAttribute_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_QueryInterface
#define IXmlAttribute_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_AddRef
#define IXmlAttribute_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_Release
#define IXmlAttribute_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_GetIids
#define IXmlAttribute_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_GetRuntimeClassName
#define IXmlAttribute_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_GetTrustLevel
#define IXmlAttribute_get_Name __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_get_Name
#define IXmlAttribute_get_Specified __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_get_Specified
#define IXmlAttribute_get_Value __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_get_Value
#define IXmlAttribute_put_Value __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_put_Value
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlCDataSection interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection, 0x4d04b46f, 0xc8bd, 0x45b4, 0x88,0x99, 0x04,0x00,0xd7,0xc2,0xc6,0x0f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("4d04b46f-c8bd-45b4-8899-0400d7c2c60f")
                    IXmlCDataSection : public IInspectable
                    {
                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection, 0x4d04b46f, 0xc8bd, 0x45b4, 0x88,0x99, 0x04,0x00,0xd7,0xc2,0xc6,0x0f)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection *This,
        TrustLevel *trustLevel);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSectionVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlCDataSection IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection
#define IXmlCDataSectionVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSectionVtbl
#define IXmlCDataSection __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection
#define IXmlCDataSection_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_QueryInterface
#define IXmlCDataSection_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_AddRef
#define IXmlCDataSection_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_Release
#define IXmlCDataSection_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_GetIids
#define IXmlCDataSection_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_GetRuntimeClassName
#define IXmlCDataSection_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_GetTrustLevel
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlCharacterData interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData, 0x132e42ab, 0x4e36, 0x4df6, 0xb1,0xc8, 0x0c,0xe6,0x2f,0xd8,0x8b,0x26);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("132e42ab-4e36-4df6-b1c8-0ce62fd88b26")
                    IXmlCharacterData : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_Data(
                            HSTRING *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_Data(
                            HSTRING value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_Length(
                            UINT32 *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE SubstringData(
                            UINT32 offset,
                            UINT32 count,
                            HSTRING *data) = 0;

                        virtual HRESULT STDMETHODCALLTYPE AppendData(
                            HSTRING data) = 0;

                        virtual HRESULT STDMETHODCALLTYPE InsertData(
                            UINT32 offset,
                            HSTRING data) = 0;

                        virtual HRESULT STDMETHODCALLTYPE DeleteData(
                            UINT32 offset,
                            UINT32 count) = 0;

                        virtual HRESULT STDMETHODCALLTYPE ReplaceData(
                            UINT32 offset,
                            UINT32 count,
                            HSTRING data) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData, 0x132e42ab, 0x4e36, 0x4df6, 0xb1,0xc8, 0x0c,0xe6,0x2f,0xd8,0x8b,0x26)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterDataVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
        TrustLevel *trustLevel);

    /*** IXmlCharacterData methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Data)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_Data)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_Length)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *SubstringData)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
        UINT32 offset,
        UINT32 count,
        HSTRING *data);

    HRESULT (STDMETHODCALLTYPE *AppendData)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
        HSTRING data);

    HRESULT (STDMETHODCALLTYPE *InsertData)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
        UINT32 offset,
        HSTRING data);

    HRESULT (STDMETHODCALLTYPE *DeleteData)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
        UINT32 offset,
        UINT32 count);

    HRESULT (STDMETHODCALLTYPE *ReplaceData)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
        UINT32 offset,
        UINT32 count,
        HSTRING data);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterDataVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterDataVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlCharacterData methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_get_Data(This,value) (This)->lpVtbl->get_Data(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_put_Data(This,value) (This)->lpVtbl->put_Data(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_get_Length(This,value) (This)->lpVtbl->get_Length(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_SubstringData(This,offset,count,data) (This)->lpVtbl->SubstringData(This,offset,count,data)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_AppendData(This,data) (This)->lpVtbl->AppendData(This,data)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_InsertData(This,offset,data) (This)->lpVtbl->InsertData(This,offset,data)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_DeleteData(This,offset,count) (This)->lpVtbl->DeleteData(This,offset,count)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_ReplaceData(This,offset,count,data) (This)->lpVtbl->ReplaceData(This,offset,count,data)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlCharacterData methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_get_Data(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,HSTRING *value) {
    return This->lpVtbl->get_Data(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_put_Data(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,HSTRING value) {
    return This->lpVtbl->put_Data(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_get_Length(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,UINT32 *value) {
    return This->lpVtbl->get_Length(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_SubstringData(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,UINT32 offset,UINT32 count,HSTRING *data) {
    return This->lpVtbl->SubstringData(This,offset,count,data);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_AppendData(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,HSTRING data) {
    return This->lpVtbl->AppendData(This,data);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_InsertData(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,UINT32 offset,HSTRING data) {
    return This->lpVtbl->InsertData(This,offset,data);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_DeleteData(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,UINT32 offset,UINT32 count) {
    return This->lpVtbl->DeleteData(This,offset,count);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_ReplaceData(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,UINT32 offset,UINT32 count,HSTRING data) {
    return This->lpVtbl->ReplaceData(This,offset,count,data);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlCharacterData IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData
#define IXmlCharacterDataVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterDataVtbl
#define IXmlCharacterData __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData
#define IXmlCharacterData_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_QueryInterface
#define IXmlCharacterData_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_AddRef
#define IXmlCharacterData_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_Release
#define IXmlCharacterData_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_GetIids
#define IXmlCharacterData_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_GetRuntimeClassName
#define IXmlCharacterData_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_GetTrustLevel
#define IXmlCharacterData_get_Data __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_get_Data
#define IXmlCharacterData_put_Data __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_put_Data
#define IXmlCharacterData_get_Length __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_get_Length
#define IXmlCharacterData_SubstringData __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_SubstringData
#define IXmlCharacterData_AppendData __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_AppendData
#define IXmlCharacterData_InsertData __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_InsertData
#define IXmlCharacterData_DeleteData __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_DeleteData
#define IXmlCharacterData_ReplaceData __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_ReplaceData
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlComment interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlComment, 0xbca474d5, 0xb61f, 0x4611, 0x9c,0xac, 0x2e,0x92,0xe3,0x47,0x6d,0x47);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("bca474d5-b61f-4611-9cac-2e92e3476d47")
                    IXmlComment : public IInspectable
                    {
                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlComment, 0xbca474d5, 0xb61f, 0x4611, 0x9c,0xac, 0x2e,0x92,0xe3,0x47,0x6d,0x47)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlCommentVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment *This,
        TrustLevel *trustLevel);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlCommentVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlCommentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlComment* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlComment* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlComment* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlComment* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlComment* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlComment* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlComment IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlComment
#define IXmlCommentVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlCommentVtbl
#define IXmlComment __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment
#define IXmlComment_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_QueryInterface
#define IXmlComment_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_AddRef
#define IXmlComment_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_Release
#define IXmlComment_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_GetIids
#define IXmlComment_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_GetRuntimeClassName
#define IXmlComment_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_GetTrustLevel
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlDocument interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument, 0xf7f3a506, 0x1e87, 0x42d6, 0xbc,0xfb, 0xb8,0xc8,0x09,0xfa,0x54,0x94);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("f7f3a506-1e87-42d6-bcfb-b8c809fa5494")
                    IXmlDocument : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_Doctype(
                            ABI::Windows::Data::Xml::Dom::IXmlDocumentType **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_Implementation(
                            ABI::Windows::Data::Xml::Dom::IXmlDomImplementation **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_DocumentElement(
                            ABI::Windows::Data::Xml::Dom::IXmlElement **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE CreateElement(
                            HSTRING tag_name,
                            ABI::Windows::Data::Xml::Dom::IXmlElement **new_element) = 0;

                        virtual HRESULT STDMETHODCALLTYPE CreateDocumentFragment(
                            ABI::Windows::Data::Xml::Dom::IXmlDocumentFragment **new_document_fragment) = 0;

                        virtual HRESULT STDMETHODCALLTYPE CreateTextNode(
                            HSTRING data,
                            ABI::Windows::Data::Xml::Dom::IXmlText **new_text_node) = 0;

                        virtual HRESULT STDMETHODCALLTYPE CreateComment(
                            HSTRING data,
                            ABI::Windows::Data::Xml::Dom::IXmlComment **new_comment) = 0;

                        virtual HRESULT STDMETHODCALLTYPE CreateProcessingInstruction(
                            HSTRING target,
                            HSTRING data,
                            ABI::Windows::Data::Xml::Dom::IXmlProcessingInstruction **new_processing_instruction) = 0;

                        virtual HRESULT STDMETHODCALLTYPE CreateAttribute(
                            HSTRING name,
                            ABI::Windows::Data::Xml::Dom::IXmlAttribute **new_attribute) = 0;

                        virtual HRESULT STDMETHODCALLTYPE CreateEntityReference(
                            HSTRING name,
                            ABI::Windows::Data::Xml::Dom::IXmlEntityReference **new_entity_reference) = 0;

                        virtual HRESULT STDMETHODCALLTYPE GetElementsByTagName(
                            HSTRING tag_name,
                            ABI::Windows::Data::Xml::Dom::IXmlNodeList **elements) = 0;

                        virtual HRESULT STDMETHODCALLTYPE CreateCDataSection(
                            HSTRING data,
                            ABI::Windows::Data::Xml::Dom::IXmlCDataSection **new_cdata_section) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_DocumentUri(
                            HSTRING *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE CreateAttributeNS(
                            IInspectable *namespace_uri,
                            HSTRING qualified_name,
                            ABI::Windows::Data::Xml::Dom::IXmlAttribute **new_attribute) = 0;

                        virtual HRESULT STDMETHODCALLTYPE CreateElementNS(
                            IInspectable *namespace_uri,
                            HSTRING qualified_name,
                            ABI::Windows::Data::Xml::Dom::IXmlElement **new_element) = 0;

                        virtual HRESULT STDMETHODCALLTYPE GetElementById(
                            HSTRING element_id,
                            ABI::Windows::Data::Xml::Dom::IXmlElement **element) = 0;

                        virtual HRESULT STDMETHODCALLTYPE ImportNode(
                            ABI::Windows::Data::Xml::Dom::IXmlNode *node,
                            boolean deep,
                            ABI::Windows::Data::Xml::Dom::IXmlNode **new_node) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument, 0xf7f3a506, 0x1e87, 0x42d6, 0xbc,0xfb, 0xb8,0xc8,0x09,0xfa,0x54,0x94)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        TrustLevel *trustLevel);

    /*** IXmlDocument methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Doctype)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType **value);

    HRESULT (STDMETHODCALLTYPE *get_Implementation)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation **value);

    HRESULT (STDMETHODCALLTYPE *get_DocumentElement)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement **value);

    HRESULT (STDMETHODCALLTYPE *CreateElement)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        HSTRING tag_name,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement **new_element);

    HRESULT (STDMETHODCALLTYPE *CreateDocumentFragment)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment **new_document_fragment);

    HRESULT (STDMETHODCALLTYPE *CreateTextNode)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        HSTRING data,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlText **new_text_node);

    HRESULT (STDMETHODCALLTYPE *CreateComment)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        HSTRING data,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment **new_comment);

    HRESULT (STDMETHODCALLTYPE *CreateProcessingInstruction)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        HSTRING target,
        HSTRING data,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction **new_processing_instruction);

    HRESULT (STDMETHODCALLTYPE *CreateAttribute)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        HSTRING name,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **new_attribute);

    HRESULT (STDMETHODCALLTYPE *CreateEntityReference)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        HSTRING name,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference **new_entity_reference);

    HRESULT (STDMETHODCALLTYPE *GetElementsByTagName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        HSTRING tag_name,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList **elements);

    HRESULT (STDMETHODCALLTYPE *CreateCDataSection)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        HSTRING data,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection **new_cdata_section);

    HRESULT (STDMETHODCALLTYPE *get_DocumentUri)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *CreateAttributeNS)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        IInspectable *namespace_uri,
        HSTRING qualified_name,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **new_attribute);

    HRESULT (STDMETHODCALLTYPE *CreateElementNS)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        IInspectable *namespace_uri,
        HSTRING qualified_name,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement **new_element);

    HRESULT (STDMETHODCALLTYPE *GetElementById)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        HSTRING element_id,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement **element);

    HRESULT (STDMETHODCALLTYPE *ImportNode)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *node,
        boolean deep,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **new_node);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlDocument methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_Doctype(This,value) (This)->lpVtbl->get_Doctype(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_Implementation(This,value) (This)->lpVtbl->get_Implementation(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_DocumentElement(This,value) (This)->lpVtbl->get_DocumentElement(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateElement(This,tag_name,new_element) (This)->lpVtbl->CreateElement(This,tag_name,new_element)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateDocumentFragment(This,new_document_fragment) (This)->lpVtbl->CreateDocumentFragment(This,new_document_fragment)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateTextNode(This,data,new_text_node) (This)->lpVtbl->CreateTextNode(This,data,new_text_node)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateComment(This,data,new_comment) (This)->lpVtbl->CreateComment(This,data,new_comment)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateProcessingInstruction(This,target,data,new_processing_instruction) (This)->lpVtbl->CreateProcessingInstruction(This,target,data,new_processing_instruction)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateAttribute(This,name,new_attribute) (This)->lpVtbl->CreateAttribute(This,name,new_attribute)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateEntityReference(This,name,new_entity_reference) (This)->lpVtbl->CreateEntityReference(This,name,new_entity_reference)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetElementsByTagName(This,tag_name,elements) (This)->lpVtbl->GetElementsByTagName(This,tag_name,elements)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateCDataSection(This,data,new_cdata_section) (This)->lpVtbl->CreateCDataSection(This,data,new_cdata_section)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_DocumentUri(This,value) (This)->lpVtbl->get_DocumentUri(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateAttributeNS(This,namespace_uri,qualified_name,new_attribute) (This)->lpVtbl->CreateAttributeNS(This,namespace_uri,qualified_name,new_attribute)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateElementNS(This,namespace_uri,qualified_name,new_element) (This)->lpVtbl->CreateElementNS(This,namespace_uri,qualified_name,new_element)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetElementById(This,element_id,element) (This)->lpVtbl->GetElementById(This,element_id,element)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_ImportNode(This,node,deep,new_node) (This)->lpVtbl->ImportNode(This,node,deep,new_node)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlDocument methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_Doctype(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType **value) {
    return This->lpVtbl->get_Doctype(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_Implementation(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation **value) {
    return This->lpVtbl->get_Implementation(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_DocumentElement(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement **value) {
    return This->lpVtbl->get_DocumentElement(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateElement(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,HSTRING tag_name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement **new_element) {
    return This->lpVtbl->CreateElement(This,tag_name,new_element);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateDocumentFragment(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment **new_document_fragment) {
    return This->lpVtbl->CreateDocumentFragment(This,new_document_fragment);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateTextNode(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,HSTRING data,__x_ABI_CWindows_CData_CXml_CDom_CIXmlText **new_text_node) {
    return This->lpVtbl->CreateTextNode(This,data,new_text_node);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateComment(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,HSTRING data,__x_ABI_CWindows_CData_CXml_CDom_CIXmlComment **new_comment) {
    return This->lpVtbl->CreateComment(This,data,new_comment);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateProcessingInstruction(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,HSTRING target,HSTRING data,__x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction **new_processing_instruction) {
    return This->lpVtbl->CreateProcessingInstruction(This,target,data,new_processing_instruction);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateAttribute(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,HSTRING name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **new_attribute) {
    return This->lpVtbl->CreateAttribute(This,name,new_attribute);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateEntityReference(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,HSTRING name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference **new_entity_reference) {
    return This->lpVtbl->CreateEntityReference(This,name,new_entity_reference);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetElementsByTagName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,HSTRING tag_name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList **elements) {
    return This->lpVtbl->GetElementsByTagName(This,tag_name,elements);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateCDataSection(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,HSTRING data,__x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection **new_cdata_section) {
    return This->lpVtbl->CreateCDataSection(This,data,new_cdata_section);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_DocumentUri(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,HSTRING *value) {
    return This->lpVtbl->get_DocumentUri(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateAttributeNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,IInspectable *namespace_uri,HSTRING qualified_name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **new_attribute) {
    return This->lpVtbl->CreateAttributeNS(This,namespace_uri,qualified_name,new_attribute);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateElementNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,IInspectable *namespace_uri,HSTRING qualified_name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement **new_element) {
    return This->lpVtbl->CreateElementNS(This,namespace_uri,qualified_name,new_element);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetElementById(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,HSTRING element_id,__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement **element) {
    return This->lpVtbl->GetElementById(This,element_id,element);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_ImportNode(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *node,boolean deep,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **new_node) {
    return This->lpVtbl->ImportNode(This,node,deep,new_node);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlDocument IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument
#define IXmlDocumentVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentVtbl
#define IXmlDocument __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument
#define IXmlDocument_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_QueryInterface
#define IXmlDocument_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_AddRef
#define IXmlDocument_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_Release
#define IXmlDocument_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetIids
#define IXmlDocument_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetRuntimeClassName
#define IXmlDocument_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetTrustLevel
#define IXmlDocument_get_Doctype __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_Doctype
#define IXmlDocument_get_Implementation __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_Implementation
#define IXmlDocument_get_DocumentElement __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_DocumentElement
#define IXmlDocument_CreateElement __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateElement
#define IXmlDocument_CreateDocumentFragment __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateDocumentFragment
#define IXmlDocument_CreateTextNode __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateTextNode
#define IXmlDocument_CreateComment __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateComment
#define IXmlDocument_CreateProcessingInstruction __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateProcessingInstruction
#define IXmlDocument_CreateAttribute __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateAttribute
#define IXmlDocument_CreateEntityReference __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateEntityReference
#define IXmlDocument_GetElementsByTagName __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetElementsByTagName
#define IXmlDocument_CreateCDataSection __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateCDataSection
#define IXmlDocument_get_DocumentUri __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_DocumentUri
#define IXmlDocument_CreateAttributeNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateAttributeNS
#define IXmlDocument_CreateElementNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateElementNS
#define IXmlDocument_GetElementById __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetElementById
#define IXmlDocument_ImportNode __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_ImportNode
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlDocumentFragment interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment, 0xe2ea6a96, 0x0c21, 0x44a5, 0x8b,0xc9, 0x9e,0x4a,0x26,0x27,0x08,0xec);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("e2ea6a96-0c21-44a5-8bc9-9e4a262708ec")
                    IXmlDocumentFragment : public IInspectable
                    {
                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment, 0xe2ea6a96, 0x0c21, 0x44a5, 0x8b,0xc9, 0x9e,0x4a,0x26,0x27,0x08,0xec)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragmentVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment *This,
        TrustLevel *trustLevel);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragmentVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragmentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlDocumentFragment IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment
#define IXmlDocumentFragmentVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragmentVtbl
#define IXmlDocumentFragment __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment
#define IXmlDocumentFragment_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_QueryInterface
#define IXmlDocumentFragment_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_AddRef
#define IXmlDocumentFragment_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_Release
#define IXmlDocumentFragment_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_GetIids
#define IXmlDocumentFragment_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_GetRuntimeClassName
#define IXmlDocumentFragment_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_GetTrustLevel
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlDocumentIO interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO, 0x6cd0e74e, 0xee65, 0x4489, 0x9e,0xbf, 0xca,0x43,0xe8,0x7b,0xa6,0x37);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("6cd0e74e-ee65-4489-9ebf-ca43e87ba637")
                    IXmlDocumentIO : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE LoadXml(
                            HSTRING xml) = 0;

                        virtual HRESULT STDMETHODCALLTYPE LoadXmlWithSettings(
                            HSTRING xml,
                            ABI::Windows::Data::Xml::Dom::IXmlLoadSettings *load_settings) = 0;

                        virtual HRESULT STDMETHODCALLTYPE SaveToFileAsync(
                            ABI::Windows::Storage::IStorageFile *file,
                            ABI::Windows::Foundation::IAsyncAction **async_info) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO, 0x6cd0e74e, 0xee65, 0x4489, 0x9e,0xbf, 0xca,0x43,0xe8,0x7b,0xa6,0x37)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIOVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO *This,
        TrustLevel *trustLevel);

    /*** IXmlDocumentIO methods ***/
    HRESULT (STDMETHODCALLTYPE *LoadXml)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO *This,
        HSTRING xml);

    HRESULT (STDMETHODCALLTYPE *LoadXmlWithSettings)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO *This,
        HSTRING xml,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *load_settings);

    HRESULT (STDMETHODCALLTYPE *SaveToFileAsync)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO *This,
        __x_ABI_CWindows_CStorage_CIStorageFile *file,
        __x_ABI_CWindows_CFoundation_CIAsyncAction **async_info);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIOVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIOVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlDocumentIO methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_LoadXml(This,xml) (This)->lpVtbl->LoadXml(This,xml)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_LoadXmlWithSettings(This,xml,load_settings) (This)->lpVtbl->LoadXmlWithSettings(This,xml,load_settings)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_SaveToFileAsync(This,file,async_info) (This)->lpVtbl->SaveToFileAsync(This,file,async_info)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlDocumentIO methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_LoadXml(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO* This,HSTRING xml) {
    return This->lpVtbl->LoadXml(This,xml);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_LoadXmlWithSettings(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO* This,HSTRING xml,__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *load_settings) {
    return This->lpVtbl->LoadXmlWithSettings(This,xml,load_settings);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_SaveToFileAsync(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO* This,__x_ABI_CWindows_CStorage_CIStorageFile *file,__x_ABI_CWindows_CFoundation_CIAsyncAction **async_info) {
    return This->lpVtbl->SaveToFileAsync(This,file,async_info);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlDocumentIO IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO
#define IXmlDocumentIOVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIOVtbl
#define IXmlDocumentIO __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO
#define IXmlDocumentIO_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_QueryInterface
#define IXmlDocumentIO_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_AddRef
#define IXmlDocumentIO_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_Release
#define IXmlDocumentIO_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_GetIids
#define IXmlDocumentIO_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_GetRuntimeClassName
#define IXmlDocumentIO_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_GetTrustLevel
#define IXmlDocumentIO_LoadXml __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_LoadXml
#define IXmlDocumentIO_LoadXmlWithSettings __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_LoadXmlWithSettings
#define IXmlDocumentIO_SaveToFileAsync __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_SaveToFileAsync
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlDocumentIO2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2, 0x5d034661, 0x7bd8, 0x4ad5, 0x9e,0xbf, 0x81,0xe6,0x34,0x72,0x63,0xb1);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("5d034661-7bd8-4ad5-9ebf-81e6347263b1")
                    IXmlDocumentIO2 : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE LoadXmlFromBuffer(
                            ABI::Windows::Storage::Streams::IBuffer *buffer) = 0;

                        virtual HRESULT STDMETHODCALLTYPE LoadXmlFromBufferWithSettings(
                            ABI::Windows::Storage::Streams::IBuffer *buffer,
                            ABI::Windows::Data::Xml::Dom::IXmlLoadSettings *load_settings) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2, 0x5d034661, 0x7bd8, 0x4ad5, 0x9e,0xbf, 0x81,0xe6,0x34,0x72,0x63,0xb1)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 *This,
        TrustLevel *trustLevel);

    /*** IXmlDocumentIO2 methods ***/
    HRESULT (STDMETHODCALLTYPE *LoadXmlFromBuffer)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 *This,
        __x_ABI_CWindows_CStorage_CStreams_CIBuffer *buffer);

    HRESULT (STDMETHODCALLTYPE *LoadXmlFromBufferWithSettings)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 *This,
        __x_ABI_CWindows_CStorage_CStreams_CIBuffer *buffer,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *load_settings);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2Vtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlDocumentIO2 methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_LoadXmlFromBuffer(This,buffer) (This)->lpVtbl->LoadXmlFromBuffer(This,buffer)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_LoadXmlFromBufferWithSettings(This,buffer,load_settings) (This)->lpVtbl->LoadXmlFromBufferWithSettings(This,buffer,load_settings)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlDocumentIO2 methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_LoadXmlFromBuffer(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2* This,__x_ABI_CWindows_CStorage_CStreams_CIBuffer *buffer) {
    return This->lpVtbl->LoadXmlFromBuffer(This,buffer);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_LoadXmlFromBufferWithSettings(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2* This,__x_ABI_CWindows_CStorage_CStreams_CIBuffer *buffer,__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *load_settings) {
    return This->lpVtbl->LoadXmlFromBufferWithSettings(This,buffer,load_settings);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlDocumentIO2 IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2
#define IXmlDocumentIO2Vtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2Vtbl
#define IXmlDocumentIO2 __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2
#define IXmlDocumentIO2_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_QueryInterface
#define IXmlDocumentIO2_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_AddRef
#define IXmlDocumentIO2_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_Release
#define IXmlDocumentIO2_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_GetIids
#define IXmlDocumentIO2_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_GetRuntimeClassName
#define IXmlDocumentIO2_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_GetTrustLevel
#define IXmlDocumentIO2_LoadXmlFromBuffer __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_LoadXmlFromBuffer
#define IXmlDocumentIO2_LoadXmlFromBufferWithSettings __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_LoadXmlFromBufferWithSettings
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlDocumentStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics, 0x5543d254, 0xd757, 0x4b79, 0x95,0x39, 0x23,0x2b,0x18,0xf5,0x0b,0xf1);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("5543d254-d757-4b79-9539-232b18f50bf1")
                    IXmlDocumentStatics : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE LoadFromUriAsync(
                            ABI::Windows::Foundation::IUriRuntimeClass *uri,
                            ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Data::Xml::Dom::XmlDocument* > **async_info) = 0;

                        virtual HRESULT STDMETHODCALLTYPE LoadFromUriWithSettingsAsync(
                            ABI::Windows::Foundation::IUriRuntimeClass *uri,
                            ABI::Windows::Data::Xml::Dom::IXmlLoadSettings *load_settings,
                            ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Data::Xml::Dom::XmlDocument* > **async_info) = 0;

                        virtual HRESULT STDMETHODCALLTYPE LoadFromFileAsync(
                            ABI::Windows::Storage::IStorageFile *file,
                            ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Data::Xml::Dom::XmlDocument* > **async_info) = 0;

                        virtual HRESULT STDMETHODCALLTYPE LoadFromFileWithSettingsAsync(
                            ABI::Windows::Storage::IStorageFile *file,
                            ABI::Windows::Data::Xml::Dom::IXmlLoadSettings *load_settings,
                            ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Data::Xml::Dom::XmlDocument* > **async_info) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics, 0x5543d254, 0xd757, 0x4b79, 0x95,0x39, 0x23,0x2b,0x18,0xf5,0x0b,0xf1)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStaticsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics *This,
        TrustLevel *trustLevel);

    /*** IXmlDocumentStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *LoadFromUriAsync)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *uri,
        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument **async_info);

    HRESULT (STDMETHODCALLTYPE *LoadFromUriWithSettingsAsync)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *uri,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *load_settings,
        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument **async_info);

    HRESULT (STDMETHODCALLTYPE *LoadFromFileAsync)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics *This,
        __x_ABI_CWindows_CStorage_CIStorageFile *file,
        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument **async_info);

    HRESULT (STDMETHODCALLTYPE *LoadFromFileWithSettingsAsync)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics *This,
        __x_ABI_CWindows_CStorage_CIStorageFile *file,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *load_settings,
        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument **async_info);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStaticsVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlDocumentStatics methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromUriAsync(This,uri,async_info) (This)->lpVtbl->LoadFromUriAsync(This,uri,async_info)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromUriWithSettingsAsync(This,uri,load_settings,async_info) (This)->lpVtbl->LoadFromUriWithSettingsAsync(This,uri,load_settings,async_info)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromFileAsync(This,file,async_info) (This)->lpVtbl->LoadFromFileAsync(This,file,async_info)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromFileWithSettingsAsync(This,file,load_settings,async_info) (This)->lpVtbl->LoadFromFileWithSettingsAsync(This,file,load_settings,async_info)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlDocumentStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromUriAsync(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *uri,__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument **async_info) {
    return This->lpVtbl->LoadFromUriAsync(This,uri,async_info);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromUriWithSettingsAsync(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *uri,__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *load_settings,__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument **async_info) {
    return This->lpVtbl->LoadFromUriWithSettingsAsync(This,uri,load_settings,async_info);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromFileAsync(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics* This,__x_ABI_CWindows_CStorage_CIStorageFile *file,__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument **async_info) {
    return This->lpVtbl->LoadFromFileAsync(This,file,async_info);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromFileWithSettingsAsync(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics* This,__x_ABI_CWindows_CStorage_CIStorageFile *file,__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *load_settings,__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument **async_info) {
    return This->lpVtbl->LoadFromFileWithSettingsAsync(This,file,load_settings,async_info);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlDocumentStatics IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics
#define IXmlDocumentStaticsVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStaticsVtbl
#define IXmlDocumentStatics __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics
#define IXmlDocumentStatics_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_QueryInterface
#define IXmlDocumentStatics_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_AddRef
#define IXmlDocumentStatics_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_Release
#define IXmlDocumentStatics_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_GetIids
#define IXmlDocumentStatics_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_GetRuntimeClassName
#define IXmlDocumentStatics_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_GetTrustLevel
#define IXmlDocumentStatics_LoadFromUriAsync __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromUriAsync
#define IXmlDocumentStatics_LoadFromUriWithSettingsAsync __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromUriWithSettingsAsync
#define IXmlDocumentStatics_LoadFromFileAsync __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromFileAsync
#define IXmlDocumentStatics_LoadFromFileWithSettingsAsync __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromFileWithSettingsAsync
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlDocumentType interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType, 0xf7342425, 0x9781, 0x4964, 0x8e,0x94, 0x9b,0x1c,0x6d,0xfc,0x9b,0xc7);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("f7342425-9781-4964-8e94-9b1c6dfc9bc7")
                    IXmlDocumentType : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_Name(
                            HSTRING *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_Entities(
                            ABI::Windows::Data::Xml::Dom::IXmlNamedNodeMap **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_Notations(
                            ABI::Windows::Data::Xml::Dom::IXmlNamedNodeMap **value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType, 0xf7342425, 0x9781, 0x4964, 0x8e,0x94, 0x9b,0x1c,0x6d,0xfc,0x9b,0xc7)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentTypeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType *This,
        TrustLevel *trustLevel);

    /*** IXmlDocumentType methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Name)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Entities)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap **value);

    HRESULT (STDMETHODCALLTYPE *get_Notations)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap **value);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentTypeVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentTypeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlDocumentType methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_get_Name(This,value) (This)->lpVtbl->get_Name(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_get_Entities(This,value) (This)->lpVtbl->get_Entities(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_get_Notations(This,value) (This)->lpVtbl->get_Notations(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlDocumentType methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_get_Name(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType* This,HSTRING *value) {
    return This->lpVtbl->get_Name(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_get_Entities(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap **value) {
    return This->lpVtbl->get_Entities(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_get_Notations(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap **value) {
    return This->lpVtbl->get_Notations(This,value);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlDocumentType IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType
#define IXmlDocumentTypeVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentTypeVtbl
#define IXmlDocumentType __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType
#define IXmlDocumentType_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_QueryInterface
#define IXmlDocumentType_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_AddRef
#define IXmlDocumentType_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_Release
#define IXmlDocumentType_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_GetIids
#define IXmlDocumentType_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_GetRuntimeClassName
#define IXmlDocumentType_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_GetTrustLevel
#define IXmlDocumentType_get_Name __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_get_Name
#define IXmlDocumentType_get_Entities __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_get_Entities
#define IXmlDocumentType_get_Notations __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_get_Notations
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlDomImplementation interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation, 0x6de58132, 0xf11d, 0x4fbb, 0x8c,0xc6, 0x58,0x3c,0xba,0x93,0x11,0x2f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("6de58132-f11d-4fbb-8cc6-583cba93112f")
                    IXmlDomImplementation : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE HasFeature(
                            HSTRING feature,
                            IInspectable *version,
                            boolean *feature_supported) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation, 0x6de58132, 0xf11d, 0x4fbb, 0x8c,0xc6, 0x58,0x3c,0xba,0x93,0x11,0x2f)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation *This,
        TrustLevel *trustLevel);

    /*** IXmlDomImplementation methods ***/
    HRESULT (STDMETHODCALLTYPE *HasFeature)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation *This,
        HSTRING feature,
        IInspectable *version,
        boolean *feature_supported);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementationVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlDomImplementation methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_HasFeature(This,feature,version,feature_supported) (This)->lpVtbl->HasFeature(This,feature,version,feature_supported)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlDomImplementation methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_HasFeature(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation* This,HSTRING feature,IInspectable *version,boolean *feature_supported) {
    return This->lpVtbl->HasFeature(This,feature,version,feature_supported);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlDomImplementation IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation
#define IXmlDomImplementationVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementationVtbl
#define IXmlDomImplementation __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation
#define IXmlDomImplementation_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_QueryInterface
#define IXmlDomImplementation_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_AddRef
#define IXmlDomImplementation_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_Release
#define IXmlDomImplementation_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_GetIids
#define IXmlDomImplementation_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_GetRuntimeClassName
#define IXmlDomImplementation_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_GetTrustLevel
#define IXmlDomImplementation_HasFeature __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_HasFeature
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlElement interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlElement, 0x2dfb8a1f, 0x6b10, 0x4ef8, 0x9f,0x83, 0xef,0xcc,0xe8,0xfa,0xec,0x37);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("2dfb8a1f-6b10-4ef8-9f83-efcce8faec37")
                    IXmlElement : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_TagName(
                            HSTRING *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE GetAttribute(
                            HSTRING attribute_name,
                            HSTRING *attribute_value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE SetAttribute(
                            HSTRING attribute_name,
                            HSTRING attribute_value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE RemoveAttribute(
                            HSTRING attribute_name) = 0;

                        virtual HRESULT STDMETHODCALLTYPE GetAttributeNode(
                            HSTRING attribute_name,
                            ABI::Windows::Data::Xml::Dom::IXmlAttribute **attribute_node) = 0;

                        virtual HRESULT STDMETHODCALLTYPE SetAttributeNode(
                            ABI::Windows::Data::Xml::Dom::IXmlAttribute *new_attribute,
                            ABI::Windows::Data::Xml::Dom::IXmlAttribute **previous_attribute) = 0;

                        virtual HRESULT STDMETHODCALLTYPE RemoveAttributeNode(
                            ABI::Windows::Data::Xml::Dom::IXmlAttribute *attribute_node,
                            ABI::Windows::Data::Xml::Dom::IXmlAttribute **removed_attribute) = 0;

                        virtual HRESULT STDMETHODCALLTYPE GetElementsByTagName(
                            HSTRING tag_name,
                            ABI::Windows::Data::Xml::Dom::IXmlNodeList **elements) = 0;

                        virtual HRESULT STDMETHODCALLTYPE SetAttributeNS(
                            IInspectable *namespace_uri,
                            HSTRING qualified_name,
                            HSTRING value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE GetAttributeNS(
                            IInspectable *namespace_uri,
                            HSTRING local_name,
                            HSTRING *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE RemoveAttributeNS(
                            IInspectable *namespace_uri,
                            HSTRING local_name) = 0;

                        virtual HRESULT STDMETHODCALLTYPE SetAttributeNodeNS(
                            ABI::Windows::Data::Xml::Dom::IXmlAttribute *new_attribute,
                            ABI::Windows::Data::Xml::Dom::IXmlAttribute **previous_attribute) = 0;

                        virtual HRESULT STDMETHODCALLTYPE GetAttributeNodeNS(
                            IInspectable *namespace_uri,
                            HSTRING local_name,
                            ABI::Windows::Data::Xml::Dom::IXmlAttribute **previous_attribute) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement, 0x2dfb8a1f, 0x6b10, 0x4ef8, 0x9f,0x83, 0xef,0xcc,0xe8,0xfa,0xec,0x37)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        TrustLevel *trustLevel);

    /*** IXmlElement methods ***/
    HRESULT (STDMETHODCALLTYPE *get_TagName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *GetAttribute)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        HSTRING attribute_name,
        HSTRING *attribute_value);

    HRESULT (STDMETHODCALLTYPE *SetAttribute)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        HSTRING attribute_name,
        HSTRING attribute_value);

    HRESULT (STDMETHODCALLTYPE *RemoveAttribute)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        HSTRING attribute_name);

    HRESULT (STDMETHODCALLTYPE *GetAttributeNode)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        HSTRING attribute_name,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **attribute_node);

    HRESULT (STDMETHODCALLTYPE *SetAttributeNode)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *new_attribute,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **previous_attribute);

    HRESULT (STDMETHODCALLTYPE *RemoveAttributeNode)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *attribute_node,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **removed_attribute);

    HRESULT (STDMETHODCALLTYPE *GetElementsByTagName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        HSTRING tag_name,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList **elements);

    HRESULT (STDMETHODCALLTYPE *SetAttributeNS)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        IInspectable *namespace_uri,
        HSTRING qualified_name,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *GetAttributeNS)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        IInspectable *namespace_uri,
        HSTRING local_name,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *RemoveAttributeNS)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        IInspectable *namespace_uri,
        HSTRING local_name);

    HRESULT (STDMETHODCALLTYPE *SetAttributeNodeNS)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *new_attribute,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **previous_attribute);

    HRESULT (STDMETHODCALLTYPE *GetAttributeNodeNS)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        IInspectable *namespace_uri,
        HSTRING local_name,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **previous_attribute);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlElementVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlElement methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_get_TagName(This,value) (This)->lpVtbl->get_TagName(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttribute(This,attribute_name,attribute_value) (This)->lpVtbl->GetAttribute(This,attribute_name,attribute_value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttribute(This,attribute_name,attribute_value) (This)->lpVtbl->SetAttribute(This,attribute_name,attribute_value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_RemoveAttribute(This,attribute_name) (This)->lpVtbl->RemoveAttribute(This,attribute_name)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttributeNode(This,attribute_name,attribute_node) (This)->lpVtbl->GetAttributeNode(This,attribute_name,attribute_node)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttributeNode(This,new_attribute,previous_attribute) (This)->lpVtbl->SetAttributeNode(This,new_attribute,previous_attribute)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_RemoveAttributeNode(This,attribute_node,removed_attribute) (This)->lpVtbl->RemoveAttributeNode(This,attribute_node,removed_attribute)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetElementsByTagName(This,tag_name,elements) (This)->lpVtbl->GetElementsByTagName(This,tag_name,elements)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttributeNS(This,namespace_uri,qualified_name,value) (This)->lpVtbl->SetAttributeNS(This,namespace_uri,qualified_name,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttributeNS(This,namespace_uri,local_name,value) (This)->lpVtbl->GetAttributeNS(This,namespace_uri,local_name,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_RemoveAttributeNS(This,namespace_uri,local_name) (This)->lpVtbl->RemoveAttributeNS(This,namespace_uri,local_name)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttributeNodeNS(This,new_attribute,previous_attribute) (This)->lpVtbl->SetAttributeNodeNS(This,new_attribute,previous_attribute)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttributeNodeNS(This,namespace_uri,local_name,previous_attribute) (This)->lpVtbl->GetAttributeNodeNS(This,namespace_uri,local_name,previous_attribute)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlElement methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_get_TagName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,HSTRING *value) {
    return This->lpVtbl->get_TagName(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttribute(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,HSTRING attribute_name,HSTRING *attribute_value) {
    return This->lpVtbl->GetAttribute(This,attribute_name,attribute_value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttribute(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,HSTRING attribute_name,HSTRING attribute_value) {
    return This->lpVtbl->SetAttribute(This,attribute_name,attribute_value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_RemoveAttribute(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,HSTRING attribute_name) {
    return This->lpVtbl->RemoveAttribute(This,attribute_name);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttributeNode(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,HSTRING attribute_name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **attribute_node) {
    return This->lpVtbl->GetAttributeNode(This,attribute_name,attribute_node);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttributeNode(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *new_attribute,__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **previous_attribute) {
    return This->lpVtbl->SetAttributeNode(This,new_attribute,previous_attribute);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_RemoveAttributeNode(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *attribute_node,__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **removed_attribute) {
    return This->lpVtbl->RemoveAttributeNode(This,attribute_node,removed_attribute);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetElementsByTagName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,HSTRING tag_name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList **elements) {
    return This->lpVtbl->GetElementsByTagName(This,tag_name,elements);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttributeNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,IInspectable *namespace_uri,HSTRING qualified_name,HSTRING value) {
    return This->lpVtbl->SetAttributeNS(This,namespace_uri,qualified_name,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttributeNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,IInspectable *namespace_uri,HSTRING local_name,HSTRING *value) {
    return This->lpVtbl->GetAttributeNS(This,namespace_uri,local_name,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_RemoveAttributeNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,IInspectable *namespace_uri,HSTRING local_name) {
    return This->lpVtbl->RemoveAttributeNS(This,namespace_uri,local_name);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttributeNodeNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *new_attribute,__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **previous_attribute) {
    return This->lpVtbl->SetAttributeNodeNS(This,new_attribute,previous_attribute);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttributeNodeNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,IInspectable *namespace_uri,HSTRING local_name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **previous_attribute) {
    return This->lpVtbl->GetAttributeNodeNS(This,namespace_uri,local_name,previous_attribute);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlElement IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlElement
#define IXmlElementVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlElementVtbl
#define IXmlElement __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement
#define IXmlElement_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_QueryInterface
#define IXmlElement_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_AddRef
#define IXmlElement_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_Release
#define IXmlElement_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetIids
#define IXmlElement_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetRuntimeClassName
#define IXmlElement_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetTrustLevel
#define IXmlElement_get_TagName __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_get_TagName
#define IXmlElement_GetAttribute __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttribute
#define IXmlElement_SetAttribute __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttribute
#define IXmlElement_RemoveAttribute __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_RemoveAttribute
#define IXmlElement_GetAttributeNode __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttributeNode
#define IXmlElement_SetAttributeNode __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttributeNode
#define IXmlElement_RemoveAttributeNode __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_RemoveAttributeNode
#define IXmlElement_GetElementsByTagName __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetElementsByTagName
#define IXmlElement_SetAttributeNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttributeNS
#define IXmlElement_GetAttributeNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttributeNS
#define IXmlElement_RemoveAttributeNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_RemoveAttributeNS
#define IXmlElement_SetAttributeNodeNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttributeNodeNS
#define IXmlElement_GetAttributeNodeNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttributeNodeNS
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlEntityReference interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference, 0x2e2f47bc, 0xc3d0, 0x4ccf, 0xbb,0x86, 0x0a,0xb8,0xc3,0x6a,0x61,0xcf);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("2e2f47bc-c3d0-4ccf-bb86-0ab8c36a61cf")
                    IXmlEntityReference : public IInspectable
                    {
                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference, 0x2e2f47bc, 0xc3d0, 0x4ccf, 0xbb,0x86, 0x0a,0xb8,0xc3,0x6a,0x61,0xcf)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReferenceVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference *This,
        TrustLevel *trustLevel);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReferenceVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReferenceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlEntityReference IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference
#define IXmlEntityReferenceVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReferenceVtbl
#define IXmlEntityReference __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference
#define IXmlEntityReference_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_QueryInterface
#define IXmlEntityReference_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_AddRef
#define IXmlEntityReference_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_Release
#define IXmlEntityReference_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_GetIids
#define IXmlEntityReference_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_GetRuntimeClassName
#define IXmlEntityReference_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_GetTrustLevel
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlLoadSettings interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings, 0x58aa07a8, 0xfed6, 0x46f7, 0xb4,0xc5, 0xfb,0x1b,0xa7,0x21,0x08,0xd6);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("58aa07a8-fed6-46f7-b4c5-fb1ba72108d6")
                    IXmlLoadSettings : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_MaxElementDepth(
                            UINT32 *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_MaxElementDepth(
                            UINT32 value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_ProhibitDtd(
                            boolean *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_ProhibitDtd(
                            boolean value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_ResolveExternals(
                            boolean *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_ResolveExternals(
                            boolean value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_ValidateOnParse(
                            boolean *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_ValidateOnParse(
                            boolean value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_ElementContentWhiteSpace(
                            boolean *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_ElementContentWhiteSpace(
                            boolean value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings, 0x58aa07a8, 0xfed6, 0x46f7, 0xb4,0xc5, 0xfb,0x1b,0xa7,0x21,0x08,0xd6)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettingsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
        TrustLevel *trustLevel);

    /*** IXmlLoadSettings methods ***/
    HRESULT (STDMETHODCALLTYPE *get_MaxElementDepth)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *put_MaxElementDepth)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
        UINT32 value);

    HRESULT (STDMETHODCALLTYPE *get_ProhibitDtd)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *put_ProhibitDtd)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
        boolean value);

    HRESULT (STDMETHODCALLTYPE *get_ResolveExternals)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *put_ResolveExternals)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
        boolean value);

    HRESULT (STDMETHODCALLTYPE *get_ValidateOnParse)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *put_ValidateOnParse)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
        boolean value);

    HRESULT (STDMETHODCALLTYPE *get_ElementContentWhiteSpace)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *put_ElementContentWhiteSpace)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
        boolean value);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettingsVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettingsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlLoadSettings methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_MaxElementDepth(This,value) (This)->lpVtbl->get_MaxElementDepth(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_MaxElementDepth(This,value) (This)->lpVtbl->put_MaxElementDepth(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ProhibitDtd(This,value) (This)->lpVtbl->get_ProhibitDtd(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ProhibitDtd(This,value) (This)->lpVtbl->put_ProhibitDtd(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ResolveExternals(This,value) (This)->lpVtbl->get_ResolveExternals(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ResolveExternals(This,value) (This)->lpVtbl->put_ResolveExternals(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ValidateOnParse(This,value) (This)->lpVtbl->get_ValidateOnParse(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ValidateOnParse(This,value) (This)->lpVtbl->put_ValidateOnParse(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ElementContentWhiteSpace(This,value) (This)->lpVtbl->get_ElementContentWhiteSpace(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ElementContentWhiteSpace(This,value) (This)->lpVtbl->put_ElementContentWhiteSpace(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlLoadSettings methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_MaxElementDepth(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,UINT32 *value) {
    return This->lpVtbl->get_MaxElementDepth(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_MaxElementDepth(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,UINT32 value) {
    return This->lpVtbl->put_MaxElementDepth(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ProhibitDtd(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,boolean *value) {
    return This->lpVtbl->get_ProhibitDtd(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ProhibitDtd(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,boolean value) {
    return This->lpVtbl->put_ProhibitDtd(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ResolveExternals(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,boolean *value) {
    return This->lpVtbl->get_ResolveExternals(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ResolveExternals(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,boolean value) {
    return This->lpVtbl->put_ResolveExternals(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ValidateOnParse(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,boolean *value) {
    return This->lpVtbl->get_ValidateOnParse(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ValidateOnParse(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,boolean value) {
    return This->lpVtbl->put_ValidateOnParse(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ElementContentWhiteSpace(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,boolean *value) {
    return This->lpVtbl->get_ElementContentWhiteSpace(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ElementContentWhiteSpace(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,boolean value) {
    return This->lpVtbl->put_ElementContentWhiteSpace(This,value);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlLoadSettings IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings
#define IXmlLoadSettingsVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettingsVtbl
#define IXmlLoadSettings __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings
#define IXmlLoadSettings_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_QueryInterface
#define IXmlLoadSettings_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_AddRef
#define IXmlLoadSettings_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_Release
#define IXmlLoadSettings_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_GetIids
#define IXmlLoadSettings_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_GetRuntimeClassName
#define IXmlLoadSettings_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_GetTrustLevel
#define IXmlLoadSettings_get_MaxElementDepth __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_MaxElementDepth
#define IXmlLoadSettings_put_MaxElementDepth __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_MaxElementDepth
#define IXmlLoadSettings_get_ProhibitDtd __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ProhibitDtd
#define IXmlLoadSettings_put_ProhibitDtd __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ProhibitDtd
#define IXmlLoadSettings_get_ResolveExternals __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ResolveExternals
#define IXmlLoadSettings_put_ResolveExternals __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ResolveExternals
#define IXmlLoadSettings_get_ValidateOnParse __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ValidateOnParse
#define IXmlLoadSettings_put_ValidateOnParse __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ValidateOnParse
#define IXmlLoadSettings_get_ElementContentWhiteSpace __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ElementContentWhiteSpace
#define IXmlLoadSettings_put_ElementContentWhiteSpace __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ElementContentWhiteSpace
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlNamedNodeMap interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap, 0xb3a69eb0, 0xaab0, 0x4b82, 0xa6,0xfa, 0xb1,0x45,0x3f,0x7c,0x02,0x1b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("b3a69eb0-aab0-4b82-a6fa-b1453f7c021b")
                    IXmlNamedNodeMap : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_Length(
                            UINT32 *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE Item(
                            UINT32 index,
                            ABI::Windows::Data::Xml::Dom::IXmlNode **node) = 0;

                        virtual HRESULT STDMETHODCALLTYPE GetNamedItem(
                            HSTRING name,
                            ABI::Windows::Data::Xml::Dom::IXmlNode **node) = 0;

                        virtual HRESULT STDMETHODCALLTYPE SetNamedItem(
                            ABI::Windows::Data::Xml::Dom::IXmlNode *node,
                            ABI::Windows::Data::Xml::Dom::IXmlNode **previous_node) = 0;

                        virtual HRESULT STDMETHODCALLTYPE RemoveNamedItem(
                            HSTRING name,
                            ABI::Windows::Data::Xml::Dom::IXmlNode **previous_node) = 0;

                        virtual HRESULT STDMETHODCALLTYPE GetNamedItemNS(
                            IInspectable *namespace_uri,
                            HSTRING name,
                            ABI::Windows::Data::Xml::Dom::IXmlNode **node) = 0;

                        virtual HRESULT STDMETHODCALLTYPE RemoveNamedItemNS(
                            IInspectable *namespace_uri,
                            HSTRING name,
                            ABI::Windows::Data::Xml::Dom::IXmlNode **previous_node) = 0;

                        virtual HRESULT STDMETHODCALLTYPE SetNamedItemNS(
                            ABI::Windows::Data::Xml::Dom::IXmlNode *node,
                            ABI::Windows::Data::Xml::Dom::IXmlNode **previous_node) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap, 0xb3a69eb0, 0xaab0, 0x4b82, 0xa6,0xfa, 0xb1,0x45,0x3f,0x7c,0x02,0x1b)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMapVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
        TrustLevel *trustLevel);

    /*** IXmlNamedNodeMap methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Length)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *Item)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
        UINT32 index,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node);

    HRESULT (STDMETHODCALLTYPE *GetNamedItem)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
        HSTRING name,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node);

    HRESULT (STDMETHODCALLTYPE *SetNamedItem)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *node,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **previous_node);

    HRESULT (STDMETHODCALLTYPE *RemoveNamedItem)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
        HSTRING name,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **previous_node);

    HRESULT (STDMETHODCALLTYPE *GetNamedItemNS)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
        IInspectable *namespace_uri,
        HSTRING name,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node);

    HRESULT (STDMETHODCALLTYPE *RemoveNamedItemNS)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
        IInspectable *namespace_uri,
        HSTRING name,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **previous_node);

    HRESULT (STDMETHODCALLTYPE *SetNamedItemNS)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *node,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **previous_node);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMapVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMapVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlNamedNodeMap methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_get_Length(This,value) (This)->lpVtbl->get_Length(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_Item(This,index,node) (This)->lpVtbl->Item(This,index,node)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetNamedItem(This,name,node) (This)->lpVtbl->GetNamedItem(This,name,node)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_SetNamedItem(This,node,previous_node) (This)->lpVtbl->SetNamedItem(This,node,previous_node)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_RemoveNamedItem(This,name,previous_node) (This)->lpVtbl->RemoveNamedItem(This,name,previous_node)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetNamedItemNS(This,namespace_uri,name,node) (This)->lpVtbl->GetNamedItemNS(This,namespace_uri,name,node)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_RemoveNamedItemNS(This,namespace_uri,name,previous_node) (This)->lpVtbl->RemoveNamedItemNS(This,namespace_uri,name,previous_node)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_SetNamedItemNS(This,node,previous_node) (This)->lpVtbl->SetNamedItemNS(This,node,previous_node)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlNamedNodeMap methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_get_Length(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,UINT32 *value) {
    return This->lpVtbl->get_Length(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_Item(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,UINT32 index,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node) {
    return This->lpVtbl->Item(This,index,node);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetNamedItem(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,HSTRING name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node) {
    return This->lpVtbl->GetNamedItem(This,name,node);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_SetNamedItem(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *node,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **previous_node) {
    return This->lpVtbl->SetNamedItem(This,node,previous_node);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_RemoveNamedItem(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,HSTRING name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **previous_node) {
    return This->lpVtbl->RemoveNamedItem(This,name,previous_node);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetNamedItemNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,IInspectable *namespace_uri,HSTRING name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node) {
    return This->lpVtbl->GetNamedItemNS(This,namespace_uri,name,node);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_RemoveNamedItemNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,IInspectable *namespace_uri,HSTRING name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **previous_node) {
    return This->lpVtbl->RemoveNamedItemNS(This,namespace_uri,name,previous_node);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_SetNamedItemNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *node,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **previous_node) {
    return This->lpVtbl->SetNamedItemNS(This,node,previous_node);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlNamedNodeMap IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap
#define IXmlNamedNodeMapVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMapVtbl
#define IXmlNamedNodeMap __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap
#define IXmlNamedNodeMap_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_QueryInterface
#define IXmlNamedNodeMap_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_AddRef
#define IXmlNamedNodeMap_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_Release
#define IXmlNamedNodeMap_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetIids
#define IXmlNamedNodeMap_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetRuntimeClassName
#define IXmlNamedNodeMap_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetTrustLevel
#define IXmlNamedNodeMap_get_Length __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_get_Length
#define IXmlNamedNodeMap_Item __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_Item
#define IXmlNamedNodeMap_GetNamedItem __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetNamedItem
#define IXmlNamedNodeMap_SetNamedItem __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_SetNamedItem
#define IXmlNamedNodeMap_RemoveNamedItem __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_RemoveNamedItem
#define IXmlNamedNodeMap_GetNamedItemNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetNamedItemNS
#define IXmlNamedNodeMap_RemoveNamedItemNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_RemoveNamedItemNS
#define IXmlNamedNodeMap_SetNamedItemNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_SetNamedItemNS
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlNode interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlNode, 0x1c741d59, 0x2122, 0x47d5, 0xa8,0x56, 0x83,0xf3,0xd4,0x21,0x48,0x75);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("1c741d59-2122-47d5-a856-83f3d4214875")
                    IXmlNode : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_NodeValue(
                            IInspectable **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_NodeValue(
                            IInspectable *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_NodeType(
                            ABI::Windows::Data::Xml::Dom::NodeType *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_NodeName(
                            HSTRING *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_ParentNode(
                            ABI::Windows::Data::Xml::Dom::IXmlNode **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_ChildNodes(
                            ABI::Windows::Data::Xml::Dom::IXmlNodeList **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_FirstChild(
                            ABI::Windows::Data::Xml::Dom::IXmlNode **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_LastChild(
                            ABI::Windows::Data::Xml::Dom::IXmlNode **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_PreviousSibling(
                            ABI::Windows::Data::Xml::Dom::IXmlNode **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_NextSibling(
                            ABI::Windows::Data::Xml::Dom::IXmlNode **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_Attributes(
                            ABI::Windows::Data::Xml::Dom::IXmlNamedNodeMap **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE HasChildNodes(
                            boolean *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_OwnerDocument(
                            ABI::Windows::Data::Xml::Dom::IXmlDocument **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE InsertBefore(
                            ABI::Windows::Data::Xml::Dom::IXmlNode *new_child,
                            ABI::Windows::Data::Xml::Dom::IXmlNode *reference_child,
                            ABI::Windows::Data::Xml::Dom::IXmlNode **inserted_child) = 0;

                        virtual HRESULT STDMETHODCALLTYPE ReplaceChild(
                            ABI::Windows::Data::Xml::Dom::IXmlNode *new_child,
                            ABI::Windows::Data::Xml::Dom::IXmlNode *reference_child,
                            ABI::Windows::Data::Xml::Dom::IXmlNode **previous_child) = 0;

                        virtual HRESULT STDMETHODCALLTYPE RemoveChild(
                            ABI::Windows::Data::Xml::Dom::IXmlNode *child_node,
                            ABI::Windows::Data::Xml::Dom::IXmlNode **removed_child) = 0;

                        virtual HRESULT STDMETHODCALLTYPE AppendChild(
                            ABI::Windows::Data::Xml::Dom::IXmlNode *new_child,
                            ABI::Windows::Data::Xml::Dom::IXmlNode **appended_child) = 0;

                        virtual HRESULT STDMETHODCALLTYPE CloneNode(
                            boolean deep,
                            ABI::Windows::Data::Xml::Dom::IXmlNode **new_node) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_NamespaceUri(
                            IInspectable **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_LocalName(
                            IInspectable **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_Prefix(
                            IInspectable **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE Normalize(
                            ) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_Prefix(
                            IInspectable *value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode, 0x1c741d59, 0x2122, 0x47d5, 0xa8,0x56, 0x83,0xf3,0xd4,0x21,0x48,0x75)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        TrustLevel *trustLevel);

    /*** IXmlNode methods ***/
    HRESULT (STDMETHODCALLTYPE *get_NodeValue)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        IInspectable **value);

    HRESULT (STDMETHODCALLTYPE *put_NodeValue)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        IInspectable *value);

    HRESULT (STDMETHODCALLTYPE *get_NodeType)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        __x_ABI_CWindows_CData_CXml_CDom_CNodeType *value);

    HRESULT (STDMETHODCALLTYPE *get_NodeName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_ParentNode)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value);

    HRESULT (STDMETHODCALLTYPE *get_ChildNodes)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList **value);

    HRESULT (STDMETHODCALLTYPE *get_FirstChild)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value);

    HRESULT (STDMETHODCALLTYPE *get_LastChild)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value);

    HRESULT (STDMETHODCALLTYPE *get_PreviousSibling)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value);

    HRESULT (STDMETHODCALLTYPE *get_NextSibling)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value);

    HRESULT (STDMETHODCALLTYPE *get_Attributes)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap **value);

    HRESULT (STDMETHODCALLTYPE *HasChildNodes)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_OwnerDocument)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **value);

    HRESULT (STDMETHODCALLTYPE *InsertBefore)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *new_child,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *reference_child,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **inserted_child);

    HRESULT (STDMETHODCALLTYPE *ReplaceChild)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *new_child,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *reference_child,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **previous_child);

    HRESULT (STDMETHODCALLTYPE *RemoveChild)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *child_node,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **removed_child);

    HRESULT (STDMETHODCALLTYPE *AppendChild)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *new_child,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **appended_child);

    HRESULT (STDMETHODCALLTYPE *CloneNode)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        boolean deep,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **new_node);

    HRESULT (STDMETHODCALLTYPE *get_NamespaceUri)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        IInspectable **value);

    HRESULT (STDMETHODCALLTYPE *get_LocalName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        IInspectable **value);

    HRESULT (STDMETHODCALLTYPE *get_Prefix)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        IInspectable **value);

    HRESULT (STDMETHODCALLTYPE *Normalize)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This);

    HRESULT (STDMETHODCALLTYPE *put_Prefix)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        IInspectable *value);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlNode methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NodeValue(This,value) (This)->lpVtbl->get_NodeValue(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_put_NodeValue(This,value) (This)->lpVtbl->put_NodeValue(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NodeType(This,value) (This)->lpVtbl->get_NodeType(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NodeName(This,value) (This)->lpVtbl->get_NodeName(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_ParentNode(This,value) (This)->lpVtbl->get_ParentNode(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_ChildNodes(This,value) (This)->lpVtbl->get_ChildNodes(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_FirstChild(This,value) (This)->lpVtbl->get_FirstChild(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_LastChild(This,value) (This)->lpVtbl->get_LastChild(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_PreviousSibling(This,value) (This)->lpVtbl->get_PreviousSibling(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NextSibling(This,value) (This)->lpVtbl->get_NextSibling(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_Attributes(This,value) (This)->lpVtbl->get_Attributes(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_HasChildNodes(This,value) (This)->lpVtbl->HasChildNodes(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_OwnerDocument(This,value) (This)->lpVtbl->get_OwnerDocument(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_InsertBefore(This,new_child,reference_child,inserted_child) (This)->lpVtbl->InsertBefore(This,new_child,reference_child,inserted_child)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_ReplaceChild(This,new_child,reference_child,previous_child) (This)->lpVtbl->ReplaceChild(This,new_child,reference_child,previous_child)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_RemoveChild(This,child_node,removed_child) (This)->lpVtbl->RemoveChild(This,child_node,removed_child)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_AppendChild(This,new_child,appended_child) (This)->lpVtbl->AppendChild(This,new_child,appended_child)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_CloneNode(This,deep,new_node) (This)->lpVtbl->CloneNode(This,deep,new_node)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NamespaceUri(This,value) (This)->lpVtbl->get_NamespaceUri(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_LocalName(This,value) (This)->lpVtbl->get_LocalName(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_Prefix(This,value) (This)->lpVtbl->get_Prefix(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_Normalize(This) (This)->lpVtbl->Normalize(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_put_Prefix(This,value) (This)->lpVtbl->put_Prefix(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlNode methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NodeValue(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,IInspectable **value) {
    return This->lpVtbl->get_NodeValue(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_put_NodeValue(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,IInspectable *value) {
    return This->lpVtbl->put_NodeValue(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NodeType(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CNodeType *value) {
    return This->lpVtbl->get_NodeType(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NodeName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,HSTRING *value) {
    return This->lpVtbl->get_NodeName(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_ParentNode(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value) {
    return This->lpVtbl->get_ParentNode(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_ChildNodes(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList **value) {
    return This->lpVtbl->get_ChildNodes(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_FirstChild(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value) {
    return This->lpVtbl->get_FirstChild(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_LastChild(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value) {
    return This->lpVtbl->get_LastChild(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_PreviousSibling(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value) {
    return This->lpVtbl->get_PreviousSibling(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NextSibling(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value) {
    return This->lpVtbl->get_NextSibling(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_Attributes(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap **value) {
    return This->lpVtbl->get_Attributes(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_HasChildNodes(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,boolean *value) {
    return This->lpVtbl->HasChildNodes(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_OwnerDocument(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **value) {
    return This->lpVtbl->get_OwnerDocument(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_InsertBefore(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *new_child,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *reference_child,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **inserted_child) {
    return This->lpVtbl->InsertBefore(This,new_child,reference_child,inserted_child);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_ReplaceChild(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *new_child,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *reference_child,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **previous_child) {
    return This->lpVtbl->ReplaceChild(This,new_child,reference_child,previous_child);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_RemoveChild(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *child_node,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **removed_child) {
    return This->lpVtbl->RemoveChild(This,child_node,removed_child);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_AppendChild(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *new_child,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **appended_child) {
    return This->lpVtbl->AppendChild(This,new_child,appended_child);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_CloneNode(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,boolean deep,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **new_node) {
    return This->lpVtbl->CloneNode(This,deep,new_node);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NamespaceUri(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,IInspectable **value) {
    return This->lpVtbl->get_NamespaceUri(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_LocalName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,IInspectable **value) {
    return This->lpVtbl->get_LocalName(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_Prefix(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,IInspectable **value) {
    return This->lpVtbl->get_Prefix(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_Normalize(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This) {
    return This->lpVtbl->Normalize(This);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_put_Prefix(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,IInspectable *value) {
    return This->lpVtbl->put_Prefix(This,value);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlNode IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlNode
#define IXmlNodeVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeVtbl
#define IXmlNode __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode
#define IXmlNode_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_QueryInterface
#define IXmlNode_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_AddRef
#define IXmlNode_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_Release
#define IXmlNode_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_GetIids
#define IXmlNode_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_GetRuntimeClassName
#define IXmlNode_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_GetTrustLevel
#define IXmlNode_get_NodeValue __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NodeValue
#define IXmlNode_put_NodeValue __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_put_NodeValue
#define IXmlNode_get_NodeType __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NodeType
#define IXmlNode_get_NodeName __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NodeName
#define IXmlNode_get_ParentNode __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_ParentNode
#define IXmlNode_get_ChildNodes __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_ChildNodes
#define IXmlNode_get_FirstChild __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_FirstChild
#define IXmlNode_get_LastChild __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_LastChild
#define IXmlNode_get_PreviousSibling __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_PreviousSibling
#define IXmlNode_get_NextSibling __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NextSibling
#define IXmlNode_get_Attributes __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_Attributes
#define IXmlNode_HasChildNodes __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_HasChildNodes
#define IXmlNode_get_OwnerDocument __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_OwnerDocument
#define IXmlNode_InsertBefore __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_InsertBefore
#define IXmlNode_ReplaceChild __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_ReplaceChild
#define IXmlNode_RemoveChild __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_RemoveChild
#define IXmlNode_AppendChild __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_AppendChild
#define IXmlNode_CloneNode __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_CloneNode
#define IXmlNode_get_NamespaceUri __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NamespaceUri
#define IXmlNode_get_LocalName __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_LocalName
#define IXmlNode_get_Prefix __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_Prefix
#define IXmlNode_Normalize __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_Normalize
#define IXmlNode_put_Prefix __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_put_Prefix
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlNodeList interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList, 0x8c60ad77, 0x83a4, 0x4ec1, 0x9c,0x54, 0x7b,0xa4,0x29,0xe1,0x3d,0xa6);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("8c60ad77-83a4-4ec1-9c54-7ba429e13da6")
                    IXmlNodeList : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_Length(
                            UINT32 *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE Item(
                            UINT32 index,
                            ABI::Windows::Data::Xml::Dom::IXmlNode **node) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList, 0x8c60ad77, 0x83a4, 0x4ec1, 0x9c,0x54, 0x7b,0xa4,0x29,0xe1,0x3d,0xa6)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeListVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList *This,
        TrustLevel *trustLevel);

    /*** IXmlNodeList methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Length)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *Item)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList *This,
        UINT32 index,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeListVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlNodeList methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_get_Length(This,value) (This)->lpVtbl->get_Length(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_Item(This,index,node) (This)->lpVtbl->Item(This,index,node)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlNodeList methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_get_Length(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList* This,UINT32 *value) {
    return This->lpVtbl->get_Length(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_Item(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList* This,UINT32 index,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node) {
    return This->lpVtbl->Item(This,index,node);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlNodeList IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList
#define IXmlNodeListVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeListVtbl
#define IXmlNodeList __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList
#define IXmlNodeList_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_QueryInterface
#define IXmlNodeList_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_AddRef
#define IXmlNodeList_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_Release
#define IXmlNodeList_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_GetIids
#define IXmlNodeList_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_GetRuntimeClassName
#define IXmlNodeList_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_GetTrustLevel
#define IXmlNodeList_get_Length __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_get_Length
#define IXmlNodeList_Item __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_Item
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlNodeSelector interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector, 0x63dbba8b, 0xd0db, 0x4fe1, 0xb7,0x45, 0xf9,0x43,0x3a,0xfd,0xc2,0x5b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("63dbba8b-d0db-4fe1-b745-f9433afdc25b")
                    IXmlNodeSelector : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE SelectSingleNode(
                            HSTRING xpath,
                            ABI::Windows::Data::Xml::Dom::IXmlNode **node) = 0;

                        virtual HRESULT STDMETHODCALLTYPE SelectNodes(
                            HSTRING xpath,
                            ABI::Windows::Data::Xml::Dom::IXmlNodeList **node_list) = 0;

                        virtual HRESULT STDMETHODCALLTYPE SelectSingleNodeNS(
                            HSTRING xpath,
                            IInspectable *namespaces,
                            ABI::Windows::Data::Xml::Dom::IXmlNode **node) = 0;

                        virtual HRESULT STDMETHODCALLTYPE SelectNodesNS(
                            HSTRING xpath,
                            IInspectable *namespaces,
                            ABI::Windows::Data::Xml::Dom::IXmlNodeList **node_list) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector, 0x63dbba8b, 0xd0db, 0x4fe1, 0xb7,0x45, 0xf9,0x43,0x3a,0xfd,0xc2,0x5b)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelectorVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector *This,
        TrustLevel *trustLevel);

    /*** IXmlNodeSelector methods ***/
    HRESULT (STDMETHODCALLTYPE *SelectSingleNode)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector *This,
        HSTRING xpath,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node);

    HRESULT (STDMETHODCALLTYPE *SelectNodes)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector *This,
        HSTRING xpath,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList **node_list);

    HRESULT (STDMETHODCALLTYPE *SelectSingleNodeNS)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector *This,
        HSTRING xpath,
        IInspectable *namespaces,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node);

    HRESULT (STDMETHODCALLTYPE *SelectNodesNS)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector *This,
        HSTRING xpath,
        IInspectable *namespaces,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList **node_list);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelectorVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelectorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlNodeSelector methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectSingleNode(This,xpath,node) (This)->lpVtbl->SelectSingleNode(This,xpath,node)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectNodes(This,xpath,node_list) (This)->lpVtbl->SelectNodes(This,xpath,node_list)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectSingleNodeNS(This,xpath,namespaces,node) (This)->lpVtbl->SelectSingleNodeNS(This,xpath,namespaces,node)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectNodesNS(This,xpath,namespaces,node_list) (This)->lpVtbl->SelectNodesNS(This,xpath,namespaces,node_list)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlNodeSelector methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectSingleNode(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector* This,HSTRING xpath,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node) {
    return This->lpVtbl->SelectSingleNode(This,xpath,node);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectNodes(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector* This,HSTRING xpath,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList **node_list) {
    return This->lpVtbl->SelectNodes(This,xpath,node_list);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectSingleNodeNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector* This,HSTRING xpath,IInspectable *namespaces,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node) {
    return This->lpVtbl->SelectSingleNodeNS(This,xpath,namespaces,node);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectNodesNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector* This,HSTRING xpath,IInspectable *namespaces,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList **node_list) {
    return This->lpVtbl->SelectNodesNS(This,xpath,namespaces,node_list);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlNodeSelector IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector
#define IXmlNodeSelectorVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelectorVtbl
#define IXmlNodeSelector __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector
#define IXmlNodeSelector_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_QueryInterface
#define IXmlNodeSelector_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_AddRef
#define IXmlNodeSelector_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_Release
#define IXmlNodeSelector_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_GetIids
#define IXmlNodeSelector_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_GetRuntimeClassName
#define IXmlNodeSelector_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_GetTrustLevel
#define IXmlNodeSelector_SelectSingleNode __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectSingleNode
#define IXmlNodeSelector_SelectNodes __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectNodes
#define IXmlNodeSelector_SelectSingleNodeNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectSingleNodeNS
#define IXmlNodeSelector_SelectNodesNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectNodesNS
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlNodeSerializer interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer, 0x5cc5b382, 0xe6dd, 0x4991, 0xab,0xef, 0x06,0xd8,0xd2,0xe7,0xbd,0x0c);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("5cc5b382-e6dd-4991-abef-06d8d2e7bd0c")
                    IXmlNodeSerializer : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE GetXml(
                            HSTRING *outer_xml) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_InnerText(
                            HSTRING *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_InnerText(
                            HSTRING value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer, 0x5cc5b382, 0xe6dd, 0x4991, 0xab,0xef, 0x06,0xd8,0xd2,0xe7,0xbd,0x0c)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer *This,
        TrustLevel *trustLevel);

    /*** IXmlNodeSerializer methods ***/
    HRESULT (STDMETHODCALLTYPE *GetXml)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer *This,
        HSTRING *outer_xml);

    HRESULT (STDMETHODCALLTYPE *get_InnerText)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_InnerText)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer *This,
        HSTRING value);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializerVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlNodeSerializer methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetXml(This,outer_xml) (This)->lpVtbl->GetXml(This,outer_xml)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_get_InnerText(This,value) (This)->lpVtbl->get_InnerText(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_put_InnerText(This,value) (This)->lpVtbl->put_InnerText(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlNodeSerializer methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetXml(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer* This,HSTRING *outer_xml) {
    return This->lpVtbl->GetXml(This,outer_xml);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_get_InnerText(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer* This,HSTRING *value) {
    return This->lpVtbl->get_InnerText(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_put_InnerText(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer* This,HSTRING value) {
    return This->lpVtbl->put_InnerText(This,value);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlNodeSerializer IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer
#define IXmlNodeSerializerVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializerVtbl
#define IXmlNodeSerializer __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer
#define IXmlNodeSerializer_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_QueryInterface
#define IXmlNodeSerializer_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_AddRef
#define IXmlNodeSerializer_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_Release
#define IXmlNodeSerializer_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetIids
#define IXmlNodeSerializer_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetRuntimeClassName
#define IXmlNodeSerializer_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetTrustLevel
#define IXmlNodeSerializer_GetXml __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetXml
#define IXmlNodeSerializer_get_InnerText __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_get_InnerText
#define IXmlNodeSerializer_put_InnerText __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_put_InnerText
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlProcessingInstruction interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction, 0x2707fd1e, 0x1e92, 0x4ece, 0xb6,0xf4, 0x26,0xf0,0x69,0x07,0x8d,0xdc);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("2707fd1e-1e92-4ece-b6f4-26f069078ddc")
                    IXmlProcessingInstruction : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_Target(
                            HSTRING *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_Data(
                            HSTRING *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_Data(
                            HSTRING value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction, 0x2707fd1e, 0x1e92, 0x4ece, 0xb6,0xf4, 0x26,0xf0,0x69,0x07,0x8d,0xdc)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstructionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction *This,
        TrustLevel *trustLevel);

    /*** IXmlProcessingInstruction methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Target)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Data)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_Data)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction *This,
        HSTRING value);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstructionVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstructionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlProcessingInstruction methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_get_Target(This,value) (This)->lpVtbl->get_Target(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_get_Data(This,value) (This)->lpVtbl->get_Data(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_put_Data(This,value) (This)->lpVtbl->put_Data(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlProcessingInstruction methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_get_Target(__x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction* This,HSTRING *value) {
    return This->lpVtbl->get_Target(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_get_Data(__x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction* This,HSTRING *value) {
    return This->lpVtbl->get_Data(This,value);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_put_Data(__x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction* This,HSTRING value) {
    return This->lpVtbl->put_Data(This,value);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlProcessingInstruction IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction
#define IXmlProcessingInstructionVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstructionVtbl
#define IXmlProcessingInstruction __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction
#define IXmlProcessingInstruction_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_QueryInterface
#define IXmlProcessingInstruction_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_AddRef
#define IXmlProcessingInstruction_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_Release
#define IXmlProcessingInstruction_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_GetIids
#define IXmlProcessingInstruction_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_GetRuntimeClassName
#define IXmlProcessingInstruction_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_GetTrustLevel
#define IXmlProcessingInstruction_get_Target __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_get_Target
#define IXmlProcessingInstruction_get_Data __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_get_Data
#define IXmlProcessingInstruction_put_Data __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_put_Data
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlText interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlText_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlText_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlText, 0xf931a4cb, 0x308d, 0x4760, 0xa1,0xd5, 0x43,0xb6,0x74,0x50,0xac,0x7e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("f931a4cb-308d-4760-a1d5-43b67450ac7e")
                    IXmlText : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE SplitText(
                            UINT32 offset,
                            ABI::Windows::Data::Xml::Dom::IXmlText **second_part) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlText, 0xf931a4cb, 0x308d, 0x4760, 0xa1,0xd5, 0x43,0xb6,0x74,0x50,0xac,0x7e)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlTextVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlText *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlText *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlText *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlText *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlText *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlText *This,
        TrustLevel *trustLevel);

    /*** IXmlText methods ***/
    HRESULT (STDMETHODCALLTYPE *SplitText)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlText *This,
        UINT32 offset,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlText **second_part);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlTextVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlText {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlTextVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlText methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_SplitText(This,offset,second_part) (This)->lpVtbl->SplitText(This,offset,second_part)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlText* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlText* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlText* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlText* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlText* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlText* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlText methods ***/
static inline HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_SplitText(__x_ABI_CWindows_CData_CXml_CDom_CIXmlText* This,UINT32 offset,__x_ABI_CWindows_CData_CXml_CDom_CIXmlText **second_part) {
    return This->lpVtbl->SplitText(This,offset,second_part);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlText IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlText
#define IXmlTextVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlTextVtbl
#define IXmlText __x_ABI_CWindows_CData_CXml_CDom_CIXmlText
#define IXmlText_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_QueryInterface
#define IXmlText_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_AddRef
#define IXmlText_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_Release
#define IXmlText_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_GetIids
#define IXmlText_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_GetRuntimeClassName
#define IXmlText_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_GetTrustLevel
#define IXmlText_SplitText __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_SplitText
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlText_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Data.Xml.Dom.DtdEntity
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_DtdEntity_DEFINED
#define RUNTIMECLASS_Windows_Data_Xml_Dom_DtdEntity_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_DtdEntity[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','D','t','d','E','n','t','i','t','y',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_DtdEntity[] = L"Windows.Data.Xml.Dom.DtdEntity";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_DtdEntity[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','D','t','d','E','n','t','i','t','y',0};
#endif
#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_DtdEntity_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Data.Xml.Dom.DtdNotation
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_DtdNotation_DEFINED
#define RUNTIMECLASS_Windows_Data_Xml_Dom_DtdNotation_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_DtdNotation[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','D','t','d','N','o','t','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_DtdNotation[] = L"Windows.Data.Xml.Dom.DtdNotation";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_DtdNotation[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','D','t','d','N','o','t','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_DtdNotation_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Data.Xml.Dom.XmlAttribute
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlAttribute_DEFINED
#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlAttribute_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlAttribute[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','A','t','t','r','i','b','u','t','e',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlAttribute[] = L"Windows.Data.Xml.Dom.XmlAttribute";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlAttribute[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','A','t','t','r','i','b','u','t','e',0};
#endif
#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlAttribute_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Data.Xml.Dom.XmlCDataSection
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlCDataSection_DEFINED
#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlCDataSection_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlCDataSection[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','C','D','a','t','a','S','e','c','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlCDataSection[] = L"Windows.Data.Xml.Dom.XmlCDataSection";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlCDataSection[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','C','D','a','t','a','S','e','c','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlCDataSection_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Data.Xml.Dom.XmlComment
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlComment_DEFINED
#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlComment_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlComment[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','C','o','m','m','e','n','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlComment[] = L"Windows.Data.Xml.Dom.XmlComment";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlComment[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','C','o','m','m','e','n','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlComment_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Data.Xml.Dom.XmlDocument
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDocument_DEFINED
#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDocument_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDocument[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','D','o','c','u','m','e','n','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDocument[] = L"Windows.Data.Xml.Dom.XmlDocument";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDocument[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','D','o','c','u','m','e','n','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDocument_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Data.Xml.Dom.XmlDocumentFragment
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDocumentFragment_DEFINED
#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDocumentFragment_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDocumentFragment[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','D','o','c','u','m','e','n','t','F','r','a','g','m','e','n','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDocumentFragment[] = L"Windows.Data.Xml.Dom.XmlDocumentFragment";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDocumentFragment[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','D','o','c','u','m','e','n','t','F','r','a','g','m','e','n','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDocumentFragment_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Data.Xml.Dom.XmlDocumentType
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDocumentType_DEFINED
#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDocumentType_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDocumentType[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','D','o','c','u','m','e','n','t','T','y','p','e',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDocumentType[] = L"Windows.Data.Xml.Dom.XmlDocumentType";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDocumentType[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','D','o','c','u','m','e','n','t','T','y','p','e',0};
#endif
#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDocumentType_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Data.Xml.Dom.XmlDomImplementation
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDomImplementation_DEFINED
#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDomImplementation_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDomImplementation[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','D','o','m','I','m','p','l','e','m','e','n','t','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDomImplementation[] = L"Windows.Data.Xml.Dom.XmlDomImplementation";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDomImplementation[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','D','o','m','I','m','p','l','e','m','e','n','t','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDomImplementation_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Data.Xml.Dom.XmlElement
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlElement_DEFINED
#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlElement_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlElement[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','E','l','e','m','e','n','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlElement[] = L"Windows.Data.Xml.Dom.XmlElement";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlElement[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','E','l','e','m','e','n','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlElement_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Data.Xml.Dom.XmlEntityReference
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlEntityReference_DEFINED
#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlEntityReference_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlEntityReference[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','E','n','t','i','t','y','R','e','f','e','r','e','n','c','e',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlEntityReference[] = L"Windows.Data.Xml.Dom.XmlEntityReference";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlEntityReference[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','E','n','t','i','t','y','R','e','f','e','r','e','n','c','e',0};
#endif
#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlEntityReference_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Data.Xml.Dom.XmlLoadSettings
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlLoadSettings_DEFINED
#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlLoadSettings_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlLoadSettings[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','L','o','a','d','S','e','t','t','i','n','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlLoadSettings[] = L"Windows.Data.Xml.Dom.XmlLoadSettings";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlLoadSettings[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','L','o','a','d','S','e','t','t','i','n','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlLoadSettings_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Data.Xml.Dom.XmlNamedNodeMap
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlNamedNodeMap_DEFINED
#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlNamedNodeMap_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlNamedNodeMap[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','N','a','m','e','d','N','o','d','e','M','a','p',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlNamedNodeMap[] = L"Windows.Data.Xml.Dom.XmlNamedNodeMap";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlNamedNodeMap[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','N','a','m','e','d','N','o','d','e','M','a','p',0};
#endif
#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlNamedNodeMap_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Data.Xml.Dom.XmlNodeList
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlNodeList_DEFINED
#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlNodeList_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlNodeList[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','N','o','d','e','L','i','s','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlNodeList[] = L"Windows.Data.Xml.Dom.XmlNodeList";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlNodeList[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','N','o','d','e','L','i','s','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlNodeList_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Data.Xml.Dom.XmlProcessingInstruction
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlProcessingInstruction_DEFINED
#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlProcessingInstruction_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlProcessingInstruction[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','P','r','o','c','e','s','s','i','n','g','I','n','s','t','r','u','c','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlProcessingInstruction[] = L"Windows.Data.Xml.Dom.XmlProcessingInstruction";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlProcessingInstruction[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','P','r','o','c','e','s','s','i','n','g','I','n','s','t','r','u','c','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlProcessingInstruction_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Data.Xml.Dom.XmlText
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlText_DEFINED
#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlText_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlText[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','T','e','x','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlText[] = L"Windows.Data.Xml.Dom.XmlText";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlText[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','T','e','x','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlText_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IIterable<ABI::Windows::Data::Xml::Dom::IXmlNode* > interface
 */
#ifndef ____FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode, 0xf1146ffc, 0x8c92, 0x56e8, 0x93,0xf1, 0x71,0x1f,0x86,0x72,0x26,0x33);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("f1146ffc-8c92-56e8-93f1-711f86722633")
                IIterable<ABI::Windows::Data::Xml::Dom::IXmlNode* > : IIterable_impl<ABI::Windows::Data::Xml::Dom::IXmlNode* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode, 0xf1146ffc, 0x8c92, 0x56e8, 0x93,0xf1, 0x71,0x1f,0x86,0x72,0x26,0x33)
#endif
#else
typedef struct __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        TrustLevel *trustLevel);

    /*** IIterable<ABI::Windows::Data::Xml::Dom::IXmlNode* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode **value);

    END_INTERFACE
} __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl;

interface __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode {
    CONST_VTBL __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::Data::Xml::Dom::IXmlNode* > methods ***/
#define __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_QueryInterface(__FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_AddRef(__FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_Release(__FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_GetIids(__FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_GetRuntimeClassName(__FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_GetTrustLevel(__FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::Data::Xml::Dom::IXmlNode* > methods ***/
static inline HRESULT __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_First(__FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode* This,__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_IXmlNode IID___FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode
#define IIterable_IXmlNodeVtbl __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl
#define IIterable_IXmlNode __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode
#define IIterable_IXmlNode_QueryInterface __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_QueryInterface
#define IIterable_IXmlNode_AddRef __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_AddRef
#define IIterable_IXmlNode_Release __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_Release
#define IIterable_IXmlNode_GetIids __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_GetIids
#define IIterable_IXmlNode_GetRuntimeClassName __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_GetRuntimeClassName
#define IIterable_IXmlNode_GetTrustLevel __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_GetTrustLevel
#define IIterable_IXmlNode_First __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::Data::Xml::Dom::IXmlNode* > interface
 */
#ifndef ____FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode, 0x3833a35e, 0x2c61, 0x56bd, 0xb0,0x93, 0x36,0x94,0x16,0x5f,0x88,0x98);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("3833a35e-2c61-56bd-b093-3694165f8898")
                IIterator<ABI::Windows::Data::Xml::Dom::IXmlNode* > : IIterator_impl<ABI::Windows::Data::Xml::Dom::IXmlNode* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode, 0x3833a35e, 0x2c61, 0x56bd, 0xb0,0x93, 0x36,0x94,0x16,0x5f,0x88,0x98)
#endif
#else
typedef struct __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        TrustLevel *trustLevel);

    /*** IIterator<ABI::Windows::Data::Xml::Dom::IXmlNode* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        UINT32 items_size,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl;

interface __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode {
    CONST_VTBL __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::Data::Xml::Dom::IXmlNode* > methods ***/
#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_QueryInterface(__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_AddRef(__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_Release(__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetIids(__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetRuntimeClassName(__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetTrustLevel(__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::Data::Xml::Dom::IXmlNode* > methods ***/
static inline HRESULT __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_get_Current(__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value) {
    return This->lpVtbl->get_Current(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_get_HasCurrent(__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_MoveNext(__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetMany(__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode* This,UINT32 items_size,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_IXmlNode IID___FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode
#define IIterator_IXmlNodeVtbl __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl
#define IIterator_IXmlNode __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode
#define IIterator_IXmlNode_QueryInterface __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_QueryInterface
#define IIterator_IXmlNode_AddRef __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_AddRef
#define IIterator_IXmlNode_Release __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_Release
#define IIterator_IXmlNode_GetIids __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetIids
#define IIterator_IXmlNode_GetRuntimeClassName __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetRuntimeClassName
#define IIterator_IXmlNode_GetTrustLevel __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetTrustLevel
#define IIterator_IXmlNode_get_Current __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_get_Current
#define IIterator_IXmlNode_get_HasCurrent __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_get_HasCurrent
#define IIterator_IXmlNode_MoveNext __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_MoveNext
#define IIterator_IXmlNode_GetMany __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::Data::Xml::Dom::IXmlNode* > interface
 */
#ifndef ____FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode, 0x139d959e, 0xe7b5, 0x5cb6, 0xa5,0x96, 0x4b,0x54,0x44,0x78,0xda,0x9b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("139d959e-e7b5-5cb6-a596-4b544478da9b")
                IVectorView<ABI::Windows::Data::Xml::Dom::IXmlNode* > : IVectorView_impl<ABI::Windows::Data::Xml::Dom::IXmlNode* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode, 0x139d959e, 0xe7b5, 0x5cb6, 0xa5,0x96, 0x4b,0x54,0x44,0x78,0xda,0x9b)
#endif
#else
typedef struct __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        TrustLevel *trustLevel);

    /*** IVectorView<ABI::Windows::Data::Xml::Dom::IXmlNode* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        UINT32 index,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl;

interface __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode {
    CONST_VTBL __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::Data::Xml::Dom::IXmlNode* > methods ***/
#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_QueryInterface(__FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_AddRef(__FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_Release(__FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetIids(__FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetRuntimeClassName(__FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetTrustLevel(__FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::Data::Xml::Dom::IXmlNode* > methods ***/
static inline HRESULT __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetAt(__FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode* This,UINT32 index,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_get_Size(__FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_IndexOf(__FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetMany(__FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_IXmlNode IID___FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode
#define IVectorView_IXmlNodeVtbl __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl
#define IVectorView_IXmlNode __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode
#define IVectorView_IXmlNode_QueryInterface __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_QueryInterface
#define IVectorView_IXmlNode_AddRef __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_AddRef
#define IVectorView_IXmlNode_Release __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_Release
#define IVectorView_IXmlNode_GetIids __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetIids
#define IVectorView_IXmlNode_GetRuntimeClassName __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetRuntimeClassName
#define IVectorView_IXmlNode_GetTrustLevel __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetTrustLevel
#define IVectorView_IXmlNode_GetAt __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetAt
#define IVectorView_IXmlNode_get_Size __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_get_Size
#define IVectorView_IXmlNode_IndexOf __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_IndexOf
#define IVectorView_IXmlNode_GetMany __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Data::Xml::Dom::XmlDocument* > interface
 */
#ifndef ____FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument, 0xf858e239, 0x1896, 0x5982, 0x84,0x95, 0x14,0x31,0x68,0x47,0x8e,0xb8);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("f858e239-1896-5982-8495-143168478eb8")
            IAsyncOperation<ABI::Windows::Data::Xml::Dom::XmlDocument* > : IAsyncOperation_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Data::Xml::Dom::XmlDocument*, ABI::Windows::Data::Xml::Dom::IXmlDocument* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument, 0xf858e239, 0x1896, 0x5982, 0x84,0x95, 0x14,0x31,0x68,0x47,0x8e,0xb8)
#endif
#else
typedef struct __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocumentVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument *This,
        TrustLevel *trustLevel);

    /*** IAsyncOperation<ABI::Windows::Data::Xml::Dom::XmlDocument* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **results);

    END_INTERFACE
} __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocumentVtbl;

interface __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument {
    CONST_VTBL __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocumentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Data::Xml::Dom::XmlDocument* > methods ***/
#define __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_QueryInterface(__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_AddRef(__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_Release(__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetIids(__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetRuntimeClassName(__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetTrustLevel(__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Data::Xml::Dom::XmlDocument* > methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_put_Completed(__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument* This,__FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_get_Completed(__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument* This,__FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetResults(__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_XmlDocument IID___FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument
#define IAsyncOperation_XmlDocumentVtbl __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocumentVtbl
#define IAsyncOperation_XmlDocument __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument
#define IAsyncOperation_XmlDocument_QueryInterface __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_QueryInterface
#define IAsyncOperation_XmlDocument_AddRef __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_AddRef
#define IAsyncOperation_XmlDocument_Release __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_Release
#define IAsyncOperation_XmlDocument_GetIids __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetIids
#define IAsyncOperation_XmlDocument_GetRuntimeClassName __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetRuntimeClassName
#define IAsyncOperation_XmlDocument_GetTrustLevel __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetTrustLevel
#define IAsyncOperation_XmlDocument_put_Completed __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_put_Completed
#define IAsyncOperation_XmlDocument_get_Completed __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_get_Completed
#define IAsyncOperation_XmlDocument_GetResults __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Data::Xml::Dom::XmlDocument* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument, 0x5eef7817, 0x93dd, 0x5c0b, 0x9e,0x5a, 0xeb,0x49,0x04,0x08,0xf3,0xa9);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("5eef7817-93dd-5c0b-9e5a-eb490408f3a9")
            IAsyncOperationCompletedHandler<ABI::Windows::Data::Xml::Dom::XmlDocument* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Data::Xml::Dom::XmlDocument*, ABI::Windows::Data::Xml::Dom::IXmlDocument* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument, 0x5eef7817, 0x93dd, 0x5c0b, 0x9e,0x5a, 0xeb,0x49,0x04,0x08,0xf3,0xa9)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocumentVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument *This);

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Data::Xml::Dom::XmlDocument* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument *This,
        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocumentVtbl;

interface __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocumentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Data::Xml::Dom::XmlDocument* > methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_QueryInterface(__FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_Release(__FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Data::Xml::Dom::XmlDocument* > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_Invoke(__FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument* This,__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_XmlDocument IID___FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument
#define IAsyncOperationCompletedHandler_XmlDocumentVtbl __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocumentVtbl
#define IAsyncOperationCompletedHandler_XmlDocument __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument
#define IAsyncOperationCompletedHandler_XmlDocument_QueryInterface __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_QueryInterface
#define IAsyncOperationCompletedHandler_XmlDocument_AddRef __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_AddRef
#define IAsyncOperationCompletedHandler_XmlDocument_Release __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_Release
#define IAsyncOperationCompletedHandler_XmlDocument_Invoke __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER HSTRING_UserSize     (ULONG *, ULONG, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserMarshal  (ULONG *, unsigned char *, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserUnmarshal(ULONG *, unsigned char *, HSTRING *);
void            __RPC_USER HSTRING_UserFree     (ULONG *, HSTRING *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_data_xml_dom_h__ */
