无法从头创建带有命名空间的新XDocument

时间:2015-03-25 16:26:34

标签: c# xml idml

我们正在尝试使用XDocument创建一个包含以下内容的新XML文档,而不查询现有文档:

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

我们查看了以下问题: Creating XDocument with xsi:schemaLocation namespace

1 个答案:

答案 0 :(得分: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"