对原子饲料中的名称空间感到困惑
-
01-10-2019 - |
题
有什么区别
<opensearch:totalResults>1000</opensearch:totalResults>
和
<totalResults xmlns="opensearch">1000</totalResults>
我正在使用.NET中的SyndicationFeed类来生成一个原子供稿,并且我需要为OpenSearch标准添加一些元素,但是当我希望它像以前的一个一样添加它们时,它会不断添加上面的元素。
编码:
feed.ElementExtensions.Add("totalResults", "opensearch", "2");
编辑
根饲料标签看起来像这样
<feed xml:lang="en-US" p1:opensearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:p1="xmlns" xmlns="http://www.w3.org/2005/Atom">
按照@reddog建议更改我的代码后,TotalResults元素看起来像这样
<totalResults xmlns="http://a9.com/-/spec/opensearch/1.1/">1000</totalResults>
将名称空间添加到供稿标签的代码看起来像这样
feed.AttributeExtensions.Add(
new XmlQualifiedName("opensearch", "xmlns"),
@"http://a9.com/-/spec/opensearch/1.1/");
和添加totalResults元素的代码现在看起来像这样
feed.ElementExtensions.Add("totalResults", @"http://a9.com/-/spec/opensearch/1.1/", "1000");
解决方案
没关系。我意识到我错误地添加了名称空间。它应该是
feed.AttributeExtensions.Add(
new XmlQualifiedName("opensearch", "http://www.w3.org/2000/xmlns/"),
"http://a9.com/-/spec/opensearch/1.1/");
其他提示
名称空间
默认名称空间是从父元素继承的。否则,您可以为孩子定义新的别名 xmlns:alias=
语法或您可以重新定义用于使用元素的默认名称空间(当然是孩子) xmlns=
句法。
您的第一个示例:
<opensearch:totalResults>1000</opensearch:totalResults>
要求“ opensearch”名称空间别名由父元素定义 - 可能在不同的名称空间中。例如:
<myRoot xmlms:opensearch="http://a9.com/-/spec/opensearch/1.1/">
<opensearch:totalResults>1000</opensearch:totalResults>
</myRoot>
尽管这意味着“ myroot”元素在不同的名称空间中 - 即默认一个元素(带有空白的名称空间或由其自己的父母定义的空间)。
插入
为了实际添加正确的命名空间元素,您需要使用名称空间本身,而不是别名(“ OpenSearch”)。
因此,要添加您的新元素,您需要从父节点中获取名称空间(否则只知道并对其进行了硬编码)。
例如
feed.ElementExtensions.Add("totalResults", "http://a9.com/-/spec/opensearch/1.1/", 1000);
但是请注意,您对命名空间的特定别名有限或无法控制。为此,您必须对XML序列化过程进行一些控制...
更完整。
设置在通道元素上指定名称空间:
feed.AttributeExtensions.Add(
new XmlQualifiedName("opensearch", XNamespace.Xmlns.ToString()),
"http://a9.com/-/spec/opensearch/1.1/");
并在totalResults上指定名称空间:
feed.ElementExtensions.Add("totalResults", "http://a9.com/-/spec/opensearch/1.1/", "1000");
那会给你:
<opensearch:totalResults>1000</opensearch:totalResults>
不隶属于 StackOverflow