2011-05-01 52 views
2

Linq中有两种方法可以为同一命名空间使用两个前缀吗?例如,在“foo1”和“foo2”下面有两个前缀指向我想在文档中使用的相同名称空间。我怎么做?c#linq xml如何为同一命名空间使用两个前缀

<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"; 

我想能够使用元素的类似的定义和usuage保持一致性。不管走到哪里我没有两个前缀我做这样的事情:

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

为什么你有这样的要求......? – 2011-05-01 05:28:24

+1

我需要两个前缀,因为从逻辑上分离相同名称空间中的元素是有意义的。尽管如此,由于这在技术上是有效的,linq必须允许某种方式这样做,不是吗? – Raj 2011-05-01 16:29:00

+0

为什么你今天需要命名空间是一样的? – Tormod 2011-08-24 21:46:19

回答

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")); 

你无法控制使用XML命名空间前缀LINQ到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文档本身来确定。