回答
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);
@Jeff:你的意思是使用索引器而不是方法調用來獲取屬性?如果是這樣,修復。如果沒有,我很困惑... –
是的,這就是我的意思。 :) –
優秀。升技無關,但我將如何檢查名稱中有名稱空間的屬性?喜歡:xmlns:aml?它說我不能有:以我的屬性名稱。 – Nicolai
查看LINQ to XML。這就是你需要的。
http://www.hookedonlinq.com/LINQtoXML5MinuteOverview.ashx
可以使用SelectMany
擴展的例子。
但是,如果你想檢查值,你可以使用LINQ來創建where
-statements。
在這裏看到:Iterating through all nodes in XML file
不久:
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);
}
}
與XDocument和其他類似DOM的方法相比,此方法通常非常快速。 – Abel
XDocument.Descendants將返回在平坦枚舉所有節點。
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);
}
沒有解釋的代碼轉儲很少有幫助。請考慮在答案中添加一些上下文。 – Chris
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;
}
}
}
}
在最簡單的解決方案是使用XPath我的意見。如果你有.NET 2,這也可以工作:
var testDoc = new XmlDocument();
testDoc.LoadXml(str);
var tmp = testDoc.SelectNodes("//*"); // match every element
- 1. 從xml文檔獲取單節點c#
- 2. 獲取節點列表從XML文檔
- 3. 解析XML文檔獲取節點值
- 4. DOM:獲取文檔中的所有文本節點(PHP)
- 5. 使用Nokogiri從Ruby中的HTML文檔獲取所有節點
- 6. HtmlAgilityPack - 獲取文檔中的所有節點
- 7. 插入XML節點和內部節點到現有的XML文檔中的C#
- 8. 獲取xml節點文本
- 9. Pentaho Kettle - 如何獲取XML文件中的所有子節點
- 10. umbraco - 如何通過文檔類型獲取所有節點
- 11. 獲取所有節點
- 12. 刪除XML文檔中每個節點的所有屬性
- 13. 獲取XML節點的值在C#
- 14. 獲取XML節點
- 15. 使用simplexml獲取XML文檔的根節點
- 16. XML文檔有多少個父節點?
- 17. 如何從C#中的XML文檔中刪除所有特定的節點?
- 18. 在xml文檔中按名稱查找所有子節點
- 19. 如何只獲取xml中的根節點的節點在c#
- 20. 在C++中使用msxml lib獲取xml文檔中的主節點列表
- 21. TinyXML2從節點和所有子節點獲取文本
- 22. C#Linq XML從文檔中提取節點
- 23. 從DOM獲取根節點文檔類
- 24. PHP DOM文檔獲取節點信息
- 25. 獲取XML中所有節點的列表
- 26. 如何獲取XML節點上的所有屬性
- 27. 使用JavaScript獲取XML中所有節點的名稱
- 28. 如何獲取特定xml節點的所有屬性qt
- 29. 返回節點中一次獲取的所有XML元素
- 30. 獲取給定XSD類型的所有XML節點
如果你需要檢查某些屬性,你不需要經過_every node_(文本節點,文檔節點,註釋節點)。只需遍歷每個元素節點或每個屬性節點(即使用LINQ或XSLT)。元素節點是唯一具有屬性的節點類型。 – Abel
這個文件有多大?即是否值得優化? –
查看鏈接[http://forums.asp.net/t/1285409.aspx/1](http://forums.asp.net/t/1285409.aspx/1)[http://www.developerfusion的.com /文章/ 4078 /讀取儲存和 - 轉化-XML的數據在網/ 5 /(http://www.developerfusion.com/article/4078/reading-storing-and-transforming-xml -data-in-net/5 /)[http://weblogs.asp.net/karan/archive/2010/04/29/parse-an-xml-file.aspx](http://weblogs.asp。 net/karan/archive/2010/04/29/parse-an-xml-file.aspx) – Prasanth