Проблема в том, что XName, используемое для создания XElement, должно указывать правильное пространство имен. Я хотел бы создать статический класс, подобный этому: -
public static class XHtml
{
public static readonly XNamespace Namespace = "http://www.w3.org/1999/xhtml";
public static XName Html { get { return Namespace + "html"; } }
public static XName Body { get { return Namespace + "body"; } }
//.. other element types
}
Теперь вы можете создать документ в формате xhtml следующим образом: -
XDocument doc = new XDocument(
new XElement(XHtml.Html,
new XElement(XHtml.Body)
)
);
Альтернативный подход к этому статическому классу: -
static class XHtml
{
public static readonly XNamespace Namespace = "http://www.w3.org/1999/xhtml";
public static readonly XName Html = Namespace + "html";
public static readonly XName Body = Namespace + "body";
}
Недостатком является создание всех возможных имен XName независимо от того, используете ли вы их, но преимуществом является преобразование пространства имен + «тэг» происходит только один раз. Я не уверен, что это преобразование было бы оптимизировано иначе. Я уверен, что XNames создаются только один раз: -
XNamepace n = "http://www.w3.org/1999/xhtml";
XNames x = n + "A";
XName y = n + "A";
Object.ReferenceEquals(x, y) //is true.