我在以下文件结构上使用了一个简单的XmlReader:
<application>
<nodetitle permission="perm1">Some Dept</nodetitle>
<project>Project A</project>
<links>
<link>
<pagename>page1.aspx</pagename>
</link>
<link>
<pagename permission="perm2">page2.aspx</pagename>
</link>
<link>
<pagename>page3.aspx</pagename>
</link>
</links>
</application>
我在XML API上生锈了,我的问题是阅读兄弟&lt; link&gt;单一传递中的元素 - 我的本能是寻找创造某种内循环?
while (reader.Read())
{
...
if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == "links"))
{
// read all <link> elements in a single pass
}
...
}
更新 - 06-25-2011
我会尝试更具体一点。我没有使用XPath。使用XmlReader 或Linq to Xml (我完全不熟悉),我想要一种方法来提取链接元素和属性并检查它们的值。
答案 0 :(得分:4)
LINQ to XML使这个东西变得简单易用:
XDocument doc = XDocument.Parse("xml here or use .Load()");
var links = doc.Descendants("link");
您可以从这里逐个读取XNode上的属性(XAttribute),或者使用LINQ再次读取所有节点的所有属性等等。
答案 1 :(得分:3)
如果您使用XML文档,那么您可以执行以下操作:
XmlNodeList nodeList = xmlDocument
.DocumentElement.SelectNodes("//application/links/link");
foreach (XmlNode node in nodeList) {
...
}
在循环中,只需获取内部<pageName>
元素并读取属性和/或文本。
也就是说,XPath比阅读器或完整的Xml doc更容易,更快,内存效率更高。 Linq2XML也非常适合使用,因为您可以在解析树上使用Linq语法。
修改强>
我觉得有点脏,因为我提到了XmlDocument所以我创建了一个简单的Linq2Xml示例,以显示这甚至可以省略任何Linq语法,以防万一你想要它:
string path = @"C:\path\to\my\xmlfile.xml";
XDocument doc = XDocument.Load(path, LoadOptions.None);
var nodes = doc.Root.Element("links").Elements("link");
foreach (var node in nodes) {
var pageNameElement = node.Element("pagename");
XAttribute permAttribute = pageNameElement.Attribute("permission");
string permission = "";
if (permAttribute != null)
permission = permAttribute.Value;
string text = pageNameElement.Value;
// Do something with the values...
}
您当然可以使用流初始化XDocument,如果这是您已有的。希望这会有所帮助:)
答案 2 :(得分:1)
虽然我不喜欢XmlReader而不是LINQ或XmlDocument, 这应该有助于你使用xmlReader(向下滚动) http://vbdotnetforum.com/index.php?/topic/493-creating-an-xml-reader/
-
U可能想使用LINQ,它不应该很难理解。这是一个启动器 http://www.developingfor.net/c-30/upgrade-your-c-skills-part-5-linq-to-xml.html