【问题标题】:Select parent node by children via XmlDocument通过 XmlDocument 按子节点选择父节点
【发布时间】:2015-02-10 12:05:28
【问题描述】:

请帮忙,我有xml文件,

<Users>
 <User FullName="" Name="sa">
  <userAvatarCache>-1</userAvatarCache>
  <description></description>
  <email></email>
  <phone></phone>
  <UserActive>true</UserActive>
 </User>

 <User FullName="asfgd" Name="stest">
  <userAvatarCache>-1</userAvatarCache>
  <description>aasad</description>
  <email>test@ukr.net</email>
  <phone>sdafdsfds0850</phone>
  <UserActive>true</UserActive>
 </User>
</Users>

我需要通过 电子邮件 选择 FullName。 我得到了所有的结构使用

 XmlDocument xmlDoc = new XmlDocument();
 xmlDoc.Load(res.GetResponseStream());
 XmlNode xmlNode = xmlDoc.DocumentElement.SelectSingleNode("User");

现在我只需要通过电子邮件发送 1 个结果(全名)。 我怎样才能做到正确? 谢谢

【问题讨论】:

  • 在文档和整个 Internet 中广泛介绍了解析和使用 XML。我完全相信你可以找到答案,或者找到一个你可以适应你的场景的答案,如果你只是寻找它的话。你研究过什么,你有什么代码来实现你的目标,但这是行不通的?
  • 而且SO充满了类似的问题。只有不同的 xml-tags 并不能使您的问题独一无二,相信我,您不是第一个需要解决此类问题的人。

标签: c# xml xmldocument


【解决方案1】:

XPath to select element based on childs child value 很好地涵盖了这一点。

string xmlString = @"
 <Users>
  <User FullName='' Name='sa'>
   <userAvatarCache>-1</userAvatarCache>
   <description></description>
   <email></email>
   <phone></phone>
   <UserActive>true</UserActive>
  </User>
  <User FullName='asfgd' Name='stest'>
   <userAvatarCache>-1</userAvatarCache>
   <description>aasad</description>
   <email>test@ukr.net</email>
   <phone>sdafdsfds0850</phone>
   <UserActive>true</UserActive>
  </User>
 </Users>";

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlString);
XmlNode xmlNode = xmlDoc.DocumentElement.SelectSingleNode("./User[email = 'test@ukr.net']");

【讨论】:

  • 谢谢,但这不是我所需要的,我可以按属性找到节点,其中包含一些内容...我需要通过这封电子邮件获取 FullName='asfgd' 和 Name='stest'。 ...而且我尝试做正确的事情:) 不要使用字符串并解析它在引号之间))
  • Vasyl 的响应包括检索“FullName”属性,然后您可以使用该属性拉取额外的“Name”元素。他还将电子邮件分离到它自己的变量中,以便可以通过方法对其进行参数化。 LINQ 也可以用来解决这个问题。
【解决方案2】:

请谷歌XPath,并尝试使用它。请注意,对大文件使用 XmlDocument 是一个非常糟糕的主意。

代码:

    var rawXml = @"<Users>
                 <User FullName="""" Name=""sa"">
                  <userAvatarCache>-1</userAvatarCache>
                  <description></description>
                  <email></email>
                  <phone></phone>
                  <UserActive>true</UserActive>
                 </User>

                 <User FullName=""asfgd"" Name=""stest"">
                  <userAvatarCache>-1</userAvatarCache>
                  <description>aasad</description>
                  <email>test@ukr.net</email>
                  <phone>sdafdsfds0850</phone>
                  <UserActive>true</UserActive>
                 </User>
                </Users>";

     XmlDocument xmlDoc = new XmlDocument();
     xmlDoc.LoadXml(rawXml);
     string email = "test@ukr.net";
     string selector = string.Format("User[email=\"{0}\"]", email);
     XmlNode xmlNode = xmlDoc.DocumentElement.SelectSingleNode(selector);

     if(xmlNode != null)
     {      
        string fullName = xmlNode.Attributes["FullName"].Value;

        Console.WriteLine(fullName);
     }

【讨论】:

    猜你喜欢
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多