簡體   English   中英

c# linq xml 如何為同一個命名空間使用兩個前綴

[英]c# linq xml how to use two prefixes for same namespace

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

我需要兩個前綴,因為命名空間可能會在以后更改 - 即使沒有,使用不同的前綴在邏輯上分隔元素也是有意義的。

是的,您可以為同一個命名空間使用兩個前綴。 您可以通過使用具有相同值的兩個命名空間來做到這一點。

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 它應該使用foo1foo2等前綴。

試圖擺弄 XML 命名空間前綴是不必要的黑客行為。 您的代碼不應依賴於具體的前綴——它們應在解析時通過閱讀 XML 文檔本身來確定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM