Возможно, это будет работать на Вас?
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);
}
}
Тип 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);
}
}
XmlReader
и XmlDocument
имеют совершенно разные способы обработки. XmlReader
ничего не хранит в памяти и использует подход «только вперед», в отличие от построения полного дерева DOM в памяти для XmlDocument
. Это полезно, когда производительность является проблемой, но также требует, чтобы вы написали свое приложение иначе: вместо использования XmlNode
вы ничего не храните и обрабатываете только «на ходу»: т. Е. Когда элемент проходит мимо того, что вам нужно, вы что-то делаете. Это близко к подходу SAX, но без модели обратного вызова.
Ответ на вопрос «как получить XmlElement» таков: вам придется создавать их с нуля на основе информации от читателя. Это, к сожалению, не дает прироста производительности. Часто лучше вообще отказаться от использования подходов DOM после переключения на XmlReader, за исключением нескольких отдельных случаев.
Кроме того, «очень удобный» способ извлечения узлов с помощью XPath ( SelectNodes
- это то, что вы показать выше) здесь нельзя использовать: XPath требует DOM-дерева. Считайте этот подход подходом с фильтрацией: вы можете добавить фильтры в XmlReader и указать ему пропускать определенные узлы или читать до определенного узла. Это очень быстро, но это другой способ мышления.
Используйте XmlDocument.ReadNode
для этого подхода. Поместите XmlReader
в оператор using и используйте XmlReader.LocalName
вместо Name, чтобы удалить префикс пространства имен.
Я использовал следующий обходной путь, когда Мне пришлось вставить данные из 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();
Почему бы просто не сделать следующее?
XmlDocument doc = new XmlDocument();
XmlNode node = doc.ReadNode(reader);