c# linq xml 如何为同一个命名空间使用两个前缀

标签 c# xml linq namespaces prefix

在 Linq 中有没有办法为同一个命名空间使用两个前缀?例如,我在“foo1”和“foo2”下方有两个前缀指向我想在我的文档中使用的同一个命名空间。我该怎么做?

<foo1:Begin foo2:Name="somevalue" xmlns:foo1="http://foo" xmlns:foo2="http://foo" xmlns="http://bar">
    <foo1:Child foo2:Name="somename" />
    <SomeBarElement />
</foo1:Begin>

在我所有的代码中,我将元素定义为:

string foo = "http://foo";
string bar = "http://bar";

string foo1 = "foo1";
string foo2 = "foo2";

XName Begin = "{" + foo + "}" + "Begin";
XName Child = "{" + foo + "}" + "Child";
XName Name = "{" + foo + "}"  + "Name";
XName SomeBarElement = "{" + bar + "}"  + "SomeBarElement";

我希望能够使用类似的元素定义和用法来保持一致性。在我没有两个前缀的地方,我会做类似的事情:

XElement doc = new XElement(Begin,
    new XAttribute(XNamespace.Xmlns + foo1, foo),
    new XAttribute(XNamespace.Xmlns, bar),
        new XElement(Child, new XAttribute(Name, "somename")),
        new XElement(SomeBarElement)
    );

我需要两个前缀,因为 namespace 以后可能会更改 - 即使没有更改,使用不同前缀在逻辑上分隔元素也是有意义的。

最佳答案

是的,您可以为同一个命名空间使用两个前缀。您可以通过使用两个具有相同值的 namespace 来执行此操作。

var bar = XNamespace.Get("http://bar"); 
var foo1 = XNamespace.Get("http://foo");
var foo2 = XNamespace.Get("http://foo");

var x = new XElement(foo1 + "begin", 
    new XAttribute(foo2 + "Name", "somevalue"),
    new XElement("child", new XAttribute(foo2 + "Name", "somevalue")), 
    new XElement(bar + "barElement")); 

但是您不能使用 LINQ-to-XML 控制 XML 命名空间前缀;并且您不应该需要控制 namespace 前缀。

此 XML 呈现为

<begin p1:Name="somevalue" xmlns:p1="http://foo" xmlns="http://foo">
  <child p1:Name="somevalue" xmlns="" />
  <barElement xmlns="http://bar" />
</begin>

如您所见,您拥有三个命名空间,xmlnsxmlns:p1 都引用您的 http://foo URI。但是没有办法告诉 LINQ-to-XML 它应该使用 foo1foo2 等前缀。

尝试摆弄 XML namespace 前缀是不必要的黑客攻击。您的代码不应依赖于具体的前缀 - 它们应该在解析时通过读取 XML 文档本身来确定。

关于c# linq xml 如何为同一个命名空间使用两个前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5846201/

相关文章:

c# - ASP.net core viewmodel 字段是必需的,尽管它可以为 null

C#-HttpWebRequest-POST

python - 在 Python 中编写 ElementTree 时如何保留 ASCII 十六进制代码点?

c# - 用另一个 linq 表达式包装一个 linq 表达式

c# - 参数化实例化如何与单实例生命范围一起工作

c# - 尽管线程池中有足够的线程,但请求仍在 Azure AppService 中排队

c# - 使用 JSON.NET 获取 JSON 值的路径

java - 使用 StAX : Unrecognized property 'javax.xml.stream.isInterning' 进行 xml 验证

.net - 为什么 LINQ GroupBy 在 ToArray() 之前会产生不同的结果?

c# - 我如何将 linq 转换为 lambda