Как создать XmlNodes из XmlReader

Возможно, это будет работать на Вас?

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        Form2 f2 = new Form2();
        f2.MouseWheel += new MouseEventHandler(panel1_MouseWheel);
        f2.MouseMove += new MouseEventHandler(panel1_MouseWheel);
        f2.Show(this);
    }

    private void panel1_MouseWheel(object sender, MouseEventArgs e)
    {
        if(e.Delta != 0) Console.Out.WriteLine(e.Delta);
    }
}
13
задан JohnIdol 14 October 2009 в 13:27
поделиться

5 ответов

Тип XmlNode не имеет общедоступного конструктора, поэтому вы не можете создавать их самостоятельно. Вам понадобится XmlDocument , который вы можете использовать для их создания:

XmlDocument doc = new XmlDocument();
while (xmlReader.Read())
{
    //keep reading until we see my element
    if (xmlReader.Name.Equals("myElementName") && (xmlReader.NodeType == XmlNodeType.Element))
    {
        // How do I get the Xml element from the reader here?
        XmlNode myNode = doc.CreateNode(XmlNodeType.Element, xmlReader.Name, "");
        nodeList.Add(myNode);
    }        
}
6
ответ дан 1 December 2019 в 20:30
поделиться

XmlReader и XmlDocument имеют совершенно разные способы обработки. XmlReader ничего не хранит в памяти и использует подход «только вперед», в отличие от построения полного дерева DOM в памяти для XmlDocument . Это полезно, когда производительность является проблемой, но также требует, чтобы вы написали свое приложение иначе: вместо использования XmlNode вы ничего не храните и обрабатываете только «на ходу»: т. Е. Когда элемент проходит мимо того, что вам нужно, вы что-то делаете. Это близко к подходу SAX, но без модели обратного вызова.

Ответ на вопрос «как получить XmlElement» таков: вам придется создавать их с нуля на основе информации от читателя. Это, к сожалению, не дает прироста производительности. Часто лучше вообще отказаться от использования подходов DOM после переключения на XmlReader, за исключением нескольких отдельных случаев.

Кроме того, «очень удобный» способ извлечения узлов с помощью XPath ( SelectNodes - это то, что вы показать выше) здесь нельзя использовать: XPath требует DOM-дерева. Считайте этот подход подходом с фильтрацией: вы можете добавить фильтры в XmlReader и указать ему пропускать определенные узлы или читать до определенного узла. Это очень быстро, но это другой способ мышления.

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

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

5
ответ дан 1 December 2019 в 20:30
поделиться

Используйте XmlDocument.ReadNode для этого подхода. Поместите XmlReader в оператор using и используйте XmlReader.LocalName вместо Name, чтобы удалить префикс пространства имен.

4
ответ дан 1 December 2019 в 20:30
поделиться

Я использовал следующий обходной путь, когда Мне пришлось вставить данные из XmlReader в XmlDocumenht :

XmlReader rdr = cmd.ExecuteXmlReader();

XmlDocument doc = new XmlDocument();

// create a container node for our resultset
XmlElement root = doc.CreateElement("QueryRoot");
doc.AppendChild(root);

StringBuilder xmlBody = new StringBuilder();

while(rdr.Read())
{
    xmlBody.Append(rdr.ReadOuterXml());
}

root.InnerXml = xmlBody.ToString();
1
ответ дан 1 December 2019 в 20:30
поделиться

Почему бы просто не сделать следующее?

XmlDocument doc = new XmlDocument();
XmlNode node = doc.ReadNode(reader);
13
ответ дан 1 December 2019 в 20:30
поделиться
Другие вопросы по тегам:

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