【问题标题】:How to select an id from a xml element with linq如何使用 linq 从 xml 元素中选择一个 id
【发布时间】:2015-09-09 13:14:13
【问题描述】:

这是我正在使用的 XML。

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <partners>
   <access>1</access>
   <partner>
      <accessPass></accessPass>
      <accessType>0</accessType>
      <updated>1</updated>
      <saved>0</saved>
      <fingerPrint>...</fingerPrint>
      <fpSent>0</fpSent>
      <fpLength>1</fpLength>
      <id>1234</id>
      <idAsign>123456789</idAsign>//----->This is the value i want
      <idCard>0</idCard>
      <name>..</name>
      <sku>531</sku>
      <status></status>
      <UserType>...</UserType>
   </partner>
....
</partners>

我想从一个 XML 元素中选择一个特定的值,我有这个方法但是我无法检索到我想要的单个值。

 public XElement GetValueByID(string xmlPath, string value, string Segment, string child, string clause)
    {
        XDocument xmlDoc = XDocument.Load(xmlPath);
        XElement partnerValues = (from el in xmlDoc.Elements(Segment).Elements(child)
                                             where el.Element(clause).Value == value
                                             select el).FirstOrDefault();
        return partnerValues;
    }

在另一个类中,我循环所有“旧列表”以创建新列表;这就是我调用上述方法获取值的方式:

XElement userID = methodsXML.GetValueByID(rootPath,item.IdPartnerCard,"partners","partner","id");
 if (userID != null){
    idAsig = int.Parse(userID.Element("idAsign").Value.ToString());

 }

到目前为止,此方法返回所有 XML 元素,然后我必须从元素中选择项目才能获得特定值,这会使我的程序变慢,因为我正在使用 > 10k regs。此外,我正在制作一个列表以使用 foreach 循环保存新的 XML。我希望有人可以帮助我解决这个问题。

感谢您的帮助。

【问题讨论】:

  • 您的 XML 是什么样的?每次调用此方法时,您都会加载并查询文档 - 它被调用了多少次?
  • 你为什么要传入rutaPart,而实际上你并没有使用它?目前,你的问题真的很不清楚。
  • 您是否考虑过使用 XPath 来查询您的 XML 文档?根据您的查询,使用起来可能要简单得多
  • 对不起,我错过了输入“rutaPart”来更改变量名,是的,我每次循环时都会加载文件,我现在就修复它,谢谢你的建议。跨度>

标签: c# xml linq visual-studio-2010 foreach


【解决方案1】:

也许这会有用:

  XDocument doc = XDocument.Load("partners.xml");
        XElement root = doc.Root;
        var id = from el in root.Elements("partner").Elements("idAsign") select el;


        foreach (var el in id)
        {
            comboBox1.Items.Add(el.Value.ToString());
        }

我知道这不适合您的代码(组合框),但我想展示如何获取“idAsign”节点的值。

基本上,它的作用是获取所有“idAsign”值。如果您将它们列在列表中,则很容易获得特定的。

【讨论】:

    【解决方案2】:

    这适用于 LinqPad...

    void Main()
    {
        XDocument doc= XDocument.Load(@"d:\test2.xml");
        XmlNamespaceManager xnm = new XmlNamespaceManager(new NameTable()); 
        GetElement(doc, "//partners/partner/idAsign", xnm).Dump();
    }
    
    public IEnumerable<XElement> GetElement(XDocument doc, string xpath, IXmlNamespaceResolver res)
    {
        return doc.XPathSelectElements(xpath, res);
    }
    

    【讨论】:

    • 这如何帮助 OP 解决他们正在处理的问题?简单地用“试试这个”转储代码不是答案,IMO。
    • 对不起,我不想在方法中列出一个列表,我只是想在每次调用另一个类中的方法时获取一个特定的值,(我用它来做两件事,以了解它是否在 XML 文件中并获取值)。谢谢你的回答,看看我能不能用这个。
    • @SKG - 我的意思不是我(或其他任何人)对他们代码中 OP 问题的理解。这是关于发布代码而没有解释为什么代码会解决 OP 的问题。这不是一个很好的答案(IMO)。请记住,您给出的答案可能会帮助其他有类似问题的人,并且添加解释将使其更有价值。海事组织,再次。
    • @Tim..我理解你的意思......谢谢......你的第一次采取如何帮助我确定我的问题“在解决问题的道路上”?我至少提供了一个可行的解决方案,喜欢与否......我通常不会评论自我解释的代码......
    • @SKG - 通过“在路上”,我的意思是如果有人在几个月或几年后来到 Stack Overflow,因为他们正在搜索类似的问题,解释代码和原因它适用于原始问题会很有帮助,特别是如果未来读者的问题不完全相同。您和我可能认为自我解释的内容可能不会对刚接触语言或功能的人进行自我解释。
    【解决方案3】:

    很简单,只需要获取特定节点,然后在调用以XML格式获取节点的方法后获取值,例如&lt;idAsign&gt;12345&lt;/idAsign&gt;

    如下

    public XElement GetValuePartnerByID(string rutaPart, string id, string node)
        {
            XDocument archivoXML = XDocument.Load(rutaPart);
    
            XElement valuePart = (from c in archivoXML.Elements("partners").Elements("partner")
                                     where c.Element("id").Value == id
                                     select c.Element(node)).FirstOrDefault();
            return valuePart;
        }
    

    然后

    XElement userID = metodosXML.GetValuePartnerByID(path, item.IdPartnerCard, "idAsign");
                                        idAsig = int.Parse(userID.Value.ToString());
    

    谢谢

    【讨论】:

      猜你喜欢
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多