对阅读XML Data C感到困惑#

时间:2010-10-25 21:25:07

标签: c# xml

我对阅读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>

2 个答案:

答案 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是现在和未来,原因很充分。