Как создать XElement с пространством имен по умолчанию для детей, не используя XNamespace во всех дочерних узлах

используйте это в вашем заголовочном файле.

<script>
 var base_url = '<?php echo base_url(); ?>';
 </script>
9
задан Jeff Mercado 7 October 2011 в 22:49
поделиться

3 ответа

Я решил использовать статический названный класс XHtml, это похоже на это:

public static class XHtml
{
    static XHtml()
    {
        Namespace = "http://www.w3.org/1999/xhtml";
    }

    public static XNamespace Namespace { get; private set; }

    public static XElement Element(string name)
    {
        return new XElement(Namespace + name);
    }

    public static XElement Element(string name, params object[] content)
    {
        return new XElement(Namespace + name, content);
    }

    public static XElement Element(string name, object content)
    {
        return new XElement(Namespace + name, content);
    }

    public static XAttribute Attribute(string name, object value)
    {
        return new XAttribute(/* Namespace + */ name, value);
    }

    public static XText Text(string text)
    {
        return new XText(text);
    }

    public static XElement A(string url, params object[] content)
    {
        XElement result = Element("a", content);
        result.Add(Attribute("href", url));
        return result;
    }
}

Это, кажется, самый чистый способ сделать вещи, особенно как я могу затем добавить в стандартных программах удобства, такой как XHtml.A метод (не весь мой класс показывают здесь).

5
ответ дан 4 December 2019 в 21:52
поделиться

Проблема, 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 независимо от того, используете ли Вы их, но позитивный аспект является преобразованием Пространства имен + "tagname", только происходит однажды. Я не уверен, что это преобразование было бы оптимизировано иначе. Я уверен, что XNames только инстанцируются однажды:-

XNamepace n = "http://www.w3.org/1999/xhtml";
XNames x = n + "A";
XName y = n + "A";
Object.ReferenceEquals(x, y) //is true.
1
ответ дан 4 December 2019 в 21:52
поделиться

Я выбрал путь рекурсивной перезаписи. На самом деле вам не нужно «реконструировать» дерево. Вы можете просто поменять местами имена узлов ( XName ).

    private static void ApplyNamespace(XElement parent, XNamespace nameSpace)
    {
        if(DetermineIfNameSpaceShouldBeApplied(parent, nameSpace))
        {
            parent.Name = nameSpace + parent.Name.LocalName;
        }
        foreach (XElement child in parent.Elements())
        {
            ApplyNamespace(child, nameSpace);
        }
    }
3
ответ дан 4 December 2019 в 21:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: