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

本文关键字:前缀 两个 命名空间 XML linq 同一个 | 更新日期: 2023-09-27 17:54:33

是否有一种方法在Linq使用两个前缀为相同的命名空间?例如,在"foo1"answers"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)
    );

我需要两个前缀,因为名称空间以后可能会更改—即使没有更改,也可以使用不同的前缀在逻辑上分隔元素。

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

是的,您可以为同一个名称空间使用两个前缀。您可以通过使用两个具有相同值的名称空间来实现这一点。

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命名空间前缀;你不应该需要来控制命名空间前缀。

这个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它应该使用像foo1, foo2等前缀。

试图篡改XML名称空间前缀是不必要的黑客行为。您的代码不应该依赖于具体的前缀—它们应该在解析时通过读取XML文档本身来确定。