gpt4 book ai didi

c# - XElement 不应该从其父 Xelement 继承命名空间吗?

转载 作者:行者123 更新时间:2023-12-04 16:59:32 27 4
gpt4 key购买 nike

我第一次在 .NET 3.5 中使用 Linq for XML,但我在命名空间方面遇到了一些问题。即,XElement 打印如下:<opf:metadata>当我只想说 <metadata> .

这是代码:

    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:metadata”

如果我从 {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

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

最佳答案

这是因为您在元数据元素中重新声明了 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>

现在您可能会争辩说,因为您重新声明 namespace 别名以具有与以前相同的 URL,所以它应该无关紧要 - 老实说,我不知道规范对此是怎么说的。但这似乎有些道理。

另一方面,我相信这两个 XML 表单最终应该被任何解析它们的东西同等对待,所以如果创建 metadata 更方便的话。元素与所有相关的声明,那么它不应该引起任何问题...... AFAIK :)

关于c# - XElement 不应该从其父 Xelement 继承命名空间吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4972253/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com