c # linq xml, как использовать два префикса для одного и того же пространства имен - PullRequest
2 голосов
/ 01 мая 2011

Есть ли способ в 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)
    );

Мне нужны два префикса, так как пространства имен могут измениться позже - и даже если нет, имеет смысл логически разделять элементы, используя разные префиксы.

1 Ответ

1 голос
/ 20 сентября 2011

Да, вы можете использовать два префикса для одного и того же пространства имен.Это можно сделать, используя два пространства имен с одинаковым значением.

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-to-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 является ненужным взломом.Ваш код не должен зависеть от конкретных префиксов - они должны быть определены во время анализа путем чтения самого документа XML.

...