有没有简单的方法可以从XML文档中获取所有节点?我需要每个单独的节点、子节点等等,以便检查它们是否具有某些属性。
或者我必须遍历整个文档,查询子节点吗?
有没有简单的方法可以从XML文档中获取所有节点?我需要每个单独的节点、子节点等等,以便检查它们是否具有某些属性。
或者我必须遍历整个文档,查询子节点吗?
在LINQ to XML中,这非常容易:
XDocument doc = XDocument.Load("test.xml"); // Or whatever
var allElements = doc.Descendants();
因此,要查找具有特定属性的所有元素,例如:
var matchingElements = doc.Descendants()
.Where(x => x.Attribute("foo") != null);
假设你想要所有的元素。如果你想要所有的节点(包括文本节点等,但是不包括属性作为单独的节点),那么你应该使用DescendantNodes()
。
编辑:在LINQ to XML中,命名空间很方便。你可以使用:
var matchingElements = doc.Descendants()
.Where(x => x.Attribute(XNamespace.Xmlns + "aml") != null);
或者针对不同的命名空间:
XNamespace ns = "http://some.namespace.uri";
var matchingElements = doc.Descendants()
.Where(x => x.Attribute(ns + "foo") != null);
string xml = @"
<parent>
<child>
<nested />
</child>
<child>
<other>
</other>
</child>
</parent>
";
XmlReader rdr = XmlReader.Create(new System.IO.StringReader(xml));
while (rdr.Read())
{
if (rdr.NodeType == XmlNodeType.Element)
{
Console.WriteLine(rdr.LocalName);
}
}
在我看来,最简单的解决方案是使用 XPath。如果你有 .NET 2,这也可以工作:
var testDoc = new XmlDocument();
testDoc.LoadXml(str);
var tmp = testDoc.SelectNodes("//*"); // match every element
请查看LINQ to XML。它可以满足您的需求。
http://www.hookedonlinq.com/LINQtoXML5MinuteOverview.ashx
例如,您可以使用SelectMany
扩展。
但是,如果您想要检查值,只需使用LINQ创建where
语句即可。
protected void Page_Load(object sender, EventArgs e)
{
XmlDocument document = new XmlDocument();
string xmlStr;
using (var wc = new WebClient())
{
xmlStr = wc.DownloadString("test.xml");
}
var xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlStr);
XmlNode xnod = xmlDoc.DocumentElement;
AddWithChildren(xnod, 1);
}
public void AddWithChildren(XmlNode xnod, Int32 intLevel) //,XmlDocument xmlDoc
{
List<IEnumerable> item = new List<IEnumerable>();
XmlNode xnodWorking;
String strIndent = new string('-', 2 * intLevel);
String strIndent1 = new string('@', 2 * intLevel);
if (xnod.NodeType == XmlNodeType.Element)
{
item.Add(new ListXML(strIndent + xnod.Name, strIndent + xnod.Name, ""));
XmlNamedNodeMap mapAttributes = xnod.Attributes;
foreach (XmlNode xnodAttribute in mapAttributes)
{
item.Add(new ListXML(strIndent1 + xnodAttribute.Name, strIndent1 + xnodAttribute.Name, ""));
}
if (xnod.HasChildNodes)
{
xnodWorking = xnod.FirstChild;
while (xnodWorking != null)
{
AddWithChildren(xnodWorking, intLevel + 1);
xnodWorking = xnodWorking.NextSibling;
}
}
}
}
string AttrNameerr = "err";//find error code in xml
XmlReader rdr = XmlReader.Create(new stem.IO.StringReader(somesXMLtring));//somesXMLtring is xml in string variable we want to find attribute in.
while (rdr.Read())
{
if (rdr.NodeType == XmlNodeType.Element)
{
//Found the new element, now check if the required attribute is present or not. if not, ignore, if yes then display the same
string val = rdr.GetAttribute(AttrNameerr);//AttrNameerr is name of attribute we need to get value of which. here we are searching for error code stored as value of 'err' attribute
if (val != null)
textBox.Text = strResult = "error = " + rdr.GetAttribute(AttrNameerr);
}
}