我对阅读XML感到非常困惑......我感到头脑中有这种感觉。
目前,使用下面的XML作为输入源,我可以使用
获取所有名称XmlNodeList name = xDoc.GetElementsByTagName("Name");
int i;
for (i=0; i < sent.Count; i++)
{
MessageBox.Show(name[i].InnerText);
}
但是,当我尝试对id执行相同操作时,它也会返回第2行“someID”。
我基本上只需要撕掉所有InsuredListMember并保存它们,任何建议?我一直在盯着xpath教程度过一个美好的一周,他们绝对没有意义,这就是为什么我重新回到getelementsbytagname
XML:
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<id>someID</id>
<title type="text">Title</title>
<author>
<name>XML Author</name>
</author>
<updated>2010-10-25T20:05:30.267Z</updated>
<link href="currentURL"></link>
<link href="nextURL"></link>
<entry>
<id>Drivers License Number</id>
<content type="application/vnd.ctct+xml">
<InsuredListMember xmlns="http://strange.com/ns/1.0/" id="drivers license number">
<HomeAddress>123 anystreet</HomeAddress>
<Name>doe, somegal</Name>
</InsuredListMember>
</content>
</entry>
<entry>
<id>Drivers License Number</id>
<content type="application/vnd.ctct+xml">
<InsuredListMember xmlns="http://strange.com/ns/1.0/" id="drivers license number">
<HomeAddress>321 anystreet</HomeAddress>
<Name>doe, someguy</Name>
</InsuredListMember>
</content>
</entry>
</feed>
答案 0 :(得分:2)
你可以尝试
XmlNodeList xnlInsuredListMembers = xDoc.SelectNodes("//InsuredListMember");
foreach (XmlNode xnMember in xnlInsuredListMembers)
{
XmlNode xnHomeAddress = xnMember.SelectSingleNode("HomeAddress");
string sHomeAddress = xnHomeAddress.InnerText;
XmlNode xnName = xnMember.SelectSingleNode("Name");
string sName = xnName.InnerText;
saveMember(sName, sHomeAddress);
}
或类似的东西。是的,这是XPath,但我认为这只是更清洁的方式。
编辑:
好吧,就像我说的那样,XML命名空间很烦人(过去曾经一度导致我从XML源中删除所有xmlns属性,因为我不知道如何处理它们),但我只是想通了。
您需要一个XmlNamespaceManager并让它知道所使用的命名空间(出于某种原因,您只需要 InsuredListMember 标记中的那个,而不是 feed 标记中的那个)。
XmlNamespaceManager xnsmgr = new XmlNamespaceManager(xDoc.NameTable);
xnsmgr.AddNamespace("ns", "http://strange.com/ns/1.0/");
XmlNodeList xnlInsuredListMembers = xDoc.SelectNodes("//ns:InsuredListMember", xnsmgr);
foreach (XmlNode xnMember in xnlInsuredListMembers)
{
XmlNode xnHomeAddress = xnMember.SelectSingleNode("ns:HomeAddress", xnsmgr);
string sHomeAddress = xnHomeAddress.InnerText;
XmlNode xnName = xnMember.SelectSingleNode("ns:Name", xnsmgr);
string sName = xnName.InnerText;
saveMember(sName, sHomeAddress);
}
这就是它的工作方式。
答案 1 :(得分:0)
我建议学习LINQ To XML。在.NET中有一堆陈旧的DOM,LINQ在所有这些方面都得到了改进,所以我没有理由在这一点上学习它们。以下行检索LINQ中的“InsuredListMember”节点:
var insuredListMembers = xDoc.Descendants("InsuredListMember");
在这种情况下, xDoc
将是System.Xml.Linq
命名空间中的XElement
。并且insuredListMembers
将是IEnumerable<XElement>
,可以进一步查询,排序或Enumerable可以执行的任何其他操作。如果您刚刚开始使用XML,请跳过XPath
。 LINQ是现在和未来,原因很充分。