2011-02-11 53 views
0

我第一次在.NET 3.5中使用Linq for XML,并且遇到命名空间问题。也就是说,XElement是这样打印的:<opf:metadata>当我只想让它说<metadata>XElement是否不应该继承其父级Xelement的名称空间?

下面是代码:

XNamespace opfNamespace = "http://www.idpf.org/2007/opf"; 
     XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance"; 
     XNamespace dcterms = "http://purl.org/dc/terms/"; 
     XNamespace dc = "http://purl.org/dc/elements/1.1/"; 

     opfRoot = new XElement(opfNamespace + "package", 
            new XAttribute("version", "2.0"), 
            new XAttribute("unique-identifier", "uuid_id")); 
     XElement metadata = new XElement(opfNamespace + "metadata", 
            new XAttribute(XNamespace.Xmlns + "xsi", xsi), 
            new XAttribute(XNamespace.Xmlns + "opf", opfNamespace), 
            new XAttribute(XNamespace.Xmlns + "dcterms", dcterms), 
            new XAttribute(XNamespace.Xmlns + "dc", dc), 
            new XElement(dc + "language", "pt-BR")); 
     opfRoot.Add(metadata); 

这里是结果:

<?xml version="1.0" encoding="utf-8"?> 
<package version="2.0" unique-identifier="uuid_id" xmlns="http://www.idpf.org/2007/opf"> 
    <opf:metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:opf="http://www.idpf.org/2007/opf" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dc="http://purl.org/dc/elements/1.1/"> 
    <dc:language>pt-BR</dc:language> 
    </opf:metadata> 
</package> 

我预期的元数据元素来没有OPF: “OPF:元数据”

如果我从{opfNameSpace +“metadata”}中删除opfNameSpace,我会在元数据元素中获得一个空白的xmlns名称空间(xmlns =“”)。

我看着这个线程:

How can I write xml with a namespace and prefix with XElement?

这一个:

XElement default namespace on attributes provides unexpected behaviour

但他们并没有解决我的问题。有任何想法吗?

回答

2

这是因为您在元数据元素中重新声明了opf命名空间别名。只是删除该属性:

new XAttribute(XNamespace.Xmlns + "opf", opfNamespace) 

<metadata>构造函数调用,并能正常工作:

<package version="2.0" unique-identifier="uuid_id" 
     xmlns="http://www.idpf.org/2007/opf"> 
    <metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dcterms= 
"http://purl.org/dc/terms/" xmlns:dc="http://purl.org/dc/elements/1.1/"> 
    <dc:language>pt-BR</dc:language> 
    </metadata> 
</package> 

现在你可能会说,因为你重新声明命名空间的别名有URL像以前一样,这应该是无关紧要的 - 说实话,我不知道规范是怎么说的。但似乎有些合理。另一方面,我相信这两个XML表单最终会被解析它们的任何东西等价处理,所以如果创建包含所有相关声明的metadata元素更方便,那么它不应该引起任何问题... AFAIK :)

1

删除。

+0

太棒了!非常感谢。 – 2011-02-11 17:55:05

+0

+1是第一个但没有得到信用。 – 2013-04-05 12:07:02

0

由于我需要的命名空间格式非常具体,即使解决了opf:metadata问题,它也不会被正确生成,所以我找到了更好的方法。我刚创建了一个XmlDocument mannualy,并添加了XML。从那里我可以编程编辑它。像这样:

  XmlDocumentopf = new XmlDocument(); 
      opf.LoadXml("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" + 
          "<package version=\"2.0\" unique-identifier=\"uuid_id\" xmlns=\"http://www.idpf.org/2007/opf\">" + 
          "<metadata xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:opf=\"http://www.idpf.org/2007/opf\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:dcterms=\"http://purl.org/dc/terms/\">" + 
          "<dc:title>Title of this book</dc:title>" + 
          "<dc:language>pt-BR</dc:language>" + 
          "<dc:identifier id=\"uuid_id\" opf:scheme=\"uuid\">a335de4c-560f-4b75-bcba-1418b726f92c</dc:identifier>" + 
          "<dc:creator opf:role=\"aut\">Desconhecido(a)</dc:creator>" + 
          "<dc:date>2011-01-31T11:59:46.949000+00:00</dc:date>" + 
          "<meta name=\"cover\" content=\"book-cover\"/>" + 
          "</metadata>" + 
          "<manifest />" + 
          "<spine toc=\"ncx\" />" + 
          "<guide />" + 
          "</package>"); 
相关问题