Выберите узел с XPathNodeIterator без отступа XML - PullRequest
0 голосов
/ 11 июня 2009

Можно ли выбрать узел с помощью XPathNodeIterator и получить Outer Or InnerXML без отступов?

Поскольку результаты используются в выводе XHTML, отступ (с использованием пробелов) приведет к различиям в разметке.

Пример кода:

xmlDoc = New XPathDocument(fileIn, xmlSpace.Preserve)
xmlNav = xmlDoc.CreateNavigator()
Dim xmlNode As XPathNodeIterator

xmlNode = xmlNav.Select("/books/chapter[page[@process='True']]")
    While xmlNode.MoveNext()

        content = xmlNode.Current.selectSingleNode("para").OuterXML)
etc.

В этом случае я бы получил следующий результат (обратите внимание, что исходный документ (fileIn) не имеет отступов, а XML - это всего лишь одна строка:

<para process="True">
  <a href="#1109062">
    <em>Some content</em>
  </a>
</para>

Я бы хотел получить следующее.

<para process="True"><a href="#1109062"><em>Some content</em></a></para>

1 Ответ

3 голосов
/ 11 июня 2009

Отражатель предполагает, что здесь нет быстрых настроек для изменения. Это источник XPathNavigator.get_OuterXml:

public virtual string get_OuterXml()
{
    if (this.NodeType == XPathNodeType.Attribute)
    {
        return (this.Name + "=\"" + this.Value + "\"");
    }
    if (this.NodeType == XPathNodeType.Namespace)
    {
        if (this.LocalName.Length == 0)
        {
            return ("xmlns=\"" + this.Value + "\"");
        }
        return ("xmlns:" + this.LocalName + "=\"" + this.Value + "\"");
    }
    StringWriter output = new StringWriter(CultureInfo.InvariantCulture);
    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Indent = true;
    settings.OmitXmlDeclaration = true;
    settings.ConformanceLevel = ConformanceLevel.Auto;
    XmlWriter writer2 = XmlWriter.Create(output, settings);
    try
    {
        writer2.WriteNode(this, true);
    }
    finally
    {
        writer2.Close();
    }
    return output.ToString();
}

Обратите внимание на settings.Indent = true.

Одной из идей будет создание вспомогательного метода, который будет выполнять то же, что и этот код, но с использованием ваших предпочтительных настроек для XmlWriter. Затем вызовите этот метод с найденным узлом, а не обращайтесь к его OuterXml.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...