我有一个具有以下结构的xml文件。
<?xml version="1.0" encoding="UTF-8"?>
<package version="2.0" xmlns="http://www.idpf.org/2007/opf" unique-identifier="uid">
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
</metadata>
<manifest></manifest>
<spine toc="ncx"></spine>
<guide></guide>
</package>
我正在以编程方式向结构添加元素,如下所示:
XDocument opfDoc = XDocument.Load(opfFile);
//create the xmlnamespaces required for the <metadata> section of the opf file.
var dc = (XNamespace)"http://purl.org/dc/elements/1.1/";
var opf = (XNamespace)"http://www.idpf.org/2007/opf";
//**add book metadata
var meta = opfDoc.Root.Element(opf + "metadata");
meta.Add(new XElement(dc + "title", bookMetaData[0].bookTitle));
从技术上讲,这是有效的,但是生成的xml文件正在将元数据部分更改为 opf:metadata ,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<package version="2.0" xmlns="http://www.idpf.org/2007/opf" unique-identifier="uid">
<opf:metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
<dc:title>Microsoft Project 2013 & 2016 Fundamentals</dc:title>
opf:metadata 从未出现在原始文件中,我从未专门添加此内容。如果我将原始元变量更改为这样,我得到一个空引用,不能添加新元素:
var meta = opfDoc.Root.Element("metadata");
如何在不向元数据元素添加名称空间前缀的情况下将代码添加到元数据部分?
感谢。
答案 0 :(得分:0)
这是因为您有http://www.idpf.org/2007/opf
的重复名称空间声明 - 一次作为默认名称空间,一次使用opf
前缀。您可以在this fiddle中看到,只需加载XML并将其重新写回来会导致添加前缀 - 这不是您正在做的事情。
您可以从xmlns:opf
元素中删除未使用的metadata
声明,然后LINQ to XML将正确地往返XML。我不会想到你会改变它正在做的事情 - 它通过检查树查找前缀,而opf
前缀是首先它会遇到。
值得注意的是,两种表示在语义上都是相同的。差异并不重要。