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)
);
我需要两个前缀,因为命名空间可能会在以后更改 - 即使不是,使用不同的前缀在逻辑上分隔元素也是有意义的。
答案 0 :(得分:1)
是的,您可以为同一名称空间使用两个前缀。您可以通过使用具有相同值的两个名称空间来完成此操作。
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>
如您所见,您有三个名称空间,xmlns
和xmlns:p1
都引用您的http://foo
URI。但是没有办法告诉LINQ-to-XML它应该使用foo1
,foo2
等前缀。
试图摆弄XML名称空间前缀是不必要的黑客行为。您的代码不应该依赖于具体的prefxies - 它们应该在解析时通过读取XML文档来确定。