Невозможно создать новый XDocument с пространством имен с нуля

Мы пытаемся создать новый XML-документ со следующим содержимым, используя XDocument, не запрашивая существующий:

<?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>

Мы пробовали следующий код:

        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)));

Когда мы запускаем метод, он выдает ошибку new XElement(idPkg + "Story"),, и мы получаем следующее сообщение об ошибке: This operation would create an incorrectly structured document.

Мы рассмотрели следующий вопрос: Создание XDocument с пространством имен xsi: schemaLocation


person Vyache    schedule 25.03.2015    source источник
comment
возможный дубликат XDocument, содержащий пространства имен   -  person Erik Philips    schedule 25.03.2015
comment
@ErikPhilips Мы не запрашиваем XDocument, мы создаем новый с нуля.   -  person Vyache    schedule 25.03.2015
comment
XML допускает только один корневой элемент.   -  person user4003407    schedule 25.03.2015
comment
@PetSerAl, извините, забыл включить весь XML, который мы хотим создать с нуля. Теперь у него единственный корень. Обратите внимание, что хвостовая часть ‹/ idPkg: Story› теперь закрыта.   -  person Vyache    schedule 25.03.2015
comment
Но ваш код по-прежнему добавляет один XElement за другим, а не внутри.   -  person user4003407    schedule 25.03.2015
comment
@PetSerAl Да, вот и ответ, у нас круглые скобки не в том месте рядом с XAttribute, который должен быть запятой. new XAttribute("DOMVersion", "8.0"), Можете ответить, если хотите.   -  person Vyache    schedule 25.03.2015


Ответы (1)


Ваш код пытается добавить второй элемент в XDocument, который нарушает спецификацию XML и вызывает исключение. Лично я предпочитаю писать код создания XML в виде одного оператора с отступом, который напоминает структуру XML:

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.")
                )
            )
        )
    )
);

Также вы должны использовать XNamespace.Xmlns+"idPkg" вместо "xmlns"+"idPkg".

person user4003407    schedule 25.03.2015