使用 XMLReader 迭代 XML
用于迭代 XML 的符合人体工程学的语法
**我正在审查代码,因为有人报告了一个潜在的错误,我尚未验证。我将很快进行更新。感谢您的耐心 - 12月19日 - rj*** 我们的辅助方法将创建一个元素字典和一个属性字典。因此,我们只需像这样循环遍历元素和属性。 正如 XML 一样,总有 999 种其他方法可以做同样的事情,但是,这是一种简单的语法和快速的方法。
Dictionary<string, string> elements = GetElements( xmlFragment );
foreach ( var elementKeyPair in elements )
{
Dictionary<string, string> attributes = GetAttributes(elementKeyPair.Key, xmlFragment);
}
public static Dictionary<string, string> GetElements(string XmlFragment)
{
Dictionary<string, string> dictionary = new Dictionary<string, string>();
byte[] byteArray = Encoding.ASCII.GetBytes(XmlFragment); //todo: optimize me
MemoryStream stream = new MemoryStream(byteArray); //todo: optimize me
XmlReader reader = XmlReader.Create(stream);
try
{
while (reader.Read())
{
if (reader.IsStartElement())
{
KeyValuePair<string, string> pair = new KeyValuePair<string, string>(reader.Name, reader.Value);
if (dictionary.Contains(pair) == false)
{
dictionary.Add(reader.Name, reader.Value);
}
}
}
}
catch { }
return dictionary;
}
public static Dictionary<string, string> GetAttributes(string element, string XmlFragement)
{
Dictionary<string, string> dictionary = new Dictionary<string, string>();
byte[] byteArray = Encoding.ASCII.GetBytes(XmlFragement); //todo: optimize me
MemoryStream stream = new MemoryStream(byteArray); //todo: optimize me
XmlReader reader = XmlReader.Create(stream);
while (reader.Read())
{
if (reader.IsStartElement())
{
if ( reader.Name == element )
{
for ( int i = 0; i < reader.AttributeCount; ++i )
{
reader.MoveToNextAttribute();
dictionary.Add(reader.Name, reader.Value);
}
}
}
}
return dictionary;
}