2011-02-11 55 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>"); 
相關問題