Search code examples
c#xmlidml

Unable to Create New XDocument with namespace from scratch


We are trying to create a new XML document with the below content using XDocument without querying an existing one:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<idPkg:Story xmlns:idPkg="http://ns.adobe.com/AdobeInDesign/idml/1.0/packaging" DOMVersion="8.0">
    <Story Self="xyz">  
        <ParagraphStyleRange AppliedParagraphStyle="ParagraphStyle/$ID/NormalParagraphStyle">
            <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/$ID/[No character style]">
                  <Content>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In ut ipsum et libero aliquam venenatis. Vestibulum molestie neque id leo sodales porta. Proin ullamcorper molestie mi a commodo. Aenean mattis tincidunt purus id sagittis. Nam bibendum metus est, id condimentum nisi tristique posuere. Sed interdum sollicitudin tincidunt. Fusce volutpat neque turpis, eget porttitor mauris ultricies quis. Morbi posuere ligula lobortis orci dictum lobortis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. In ut ipsum et libero aliquam venenatis. Vestibulum molestie neque id leo sodales porta. Proin ullamcorper molestie mi a commodo. Aenean mattis tincidunt purus id sagittis. Nam bibendum metus est, id condimentum nisi tristique posuere. Sed interdum sollicitudin tincidunt. Fusce volutpat neque turpis, eget porttitor mauris ultricies quis. Morbi posuere ligula lobortis orci dictum lobortis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. In ut ipsum et libero aliquam venenatis. Vestibulum molestie neque id leo sodales porta. Proin ullamcorper molestie mi a commodo. Aenean mattis tincidunt purus id sagittis. Nam bibendum metus est, id condimentum nisi tristique posuere. Sed interdum sollicitudin tincidunt. Fusce volutpat neque turpis, eget porttitor mauris ultricies quis. Morbi posuere ligula lobortis orci dictum lobortis.</Content>
            </CharacterStyleRange>
        </ParagraphStyleRange>
    </Story>
</idPkg:Story>

We have tried the following code:

        Xdocument = new XDocument
        {
            Declaration = new XDeclaration("1.0", "UTF-8", "yes"),
        };
        XNamespace schemaLocation = XNamespace.Get("http://www.w3.org/2001/XMLSchema-datatypes");
        XNamespace idPkg = "http://ns.adobe.com/AdobeInDesign/idml/1.0/packaging";

        Xdocument.Add(new XElement(idPkg + "Story",
            new XAttribute("xmlns" + "idPkg", "http://ns.adobe.com/AdobeInDesign/idml/1.0/packaging"),
            new XAttribute("DOMVersion", "8.0")),
                    new XElement(idPkg + "Story"), 
                    new XAttribute("Self", "xyz" + EnumHelper.GetDescription(section)));

When we run the method, it errors on new XElement(idPkg + "Story"), and we get the following error message: This operation would create an incorrectly structured document.

We looked at the following question: Creating XDocument with xsi:schemaLocation namespace


Solution

  • Your code try to add second element to XDocument, that violate XML specification and produce exception. I personally prefer to write XML creation code as single statement with indentation, that resemble XML structure:

    XNamespace idPkg="http://ns.adobe.com/AdobeInDesign/idml/1.0/packaging";
    XDocument document=new XDocument(
        new XDeclaration("1.0","UTF-8","yes"),
        new XElement(idPkg+"Story",
            new XAttribute(XNamespace.Xmlns+"idPkg",idPkg),
            new XAttribute("DOMVersion","8.0"),
            new XElement("Story",
                new XAttribute("Self","zxc"),
                new XElement("ParagraphStyleRange",
                    new XAttribute("AppliedParagraphStyle","ParagraphStyle/$ID/NormalParagraphStyle"),
                    new XElement("CharacterStyleRange",
                        new XAttribute("AppliedCharacterStyle","CharacterStyle/$ID/[No character style]"),
                        new XElement("Content","Lorem ipsum dolor sit amet, consectetur adipiscing elit. In ut ipsum et libero aliquam venenatis. Vestibulum molestie neque id leo sodales porta. Proin ullamcorper molestie mi a commodo. Aenean mattis tincidunt purus id sagittis. Nam bibendum metus est, id condimentum nisi tristique posuere. Sed interdum sollicitudin tincidunt. Fusce volutpat neque turpis, eget porttitor mauris ultricies quis. Morbi posuere ligula lobortis orci dictum lobortis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. In ut ipsum et libero aliquam venenatis. Vestibulum molestie neque id leo sodales porta. Proin ullamcorper molestie mi a commodo. Aenean mattis tincidunt purus id sagittis. Nam bibendum metus est, id condimentum nisi tristique posuere. Sed interdum sollicitudin tincidunt. Fusce volutpat neque turpis, eget porttitor mauris ultricies quis. Morbi posuere ligula lobortis orci dictum lobortis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. In ut ipsum et libero aliquam venenatis. Vestibulum molestie neque id leo sodales porta. Proin ullamcorper molestie mi a commodo. Aenean mattis tincidunt purus id sagittis. Nam bibendum metus est, id condimentum nisi tristique posuere. Sed interdum sollicitudin tincidunt. Fusce volutpat neque turpis, eget porttitor mauris ultricies quis. Morbi posuere ligula lobortis orci dictum lobortis.")
                    )
                )
            )
        )
    );
    

    Also you should use XNamespace.Xmlns+"idPkg" instead of "xmlns"+"idPkg".