簡體   English   中英

如何使用linq從xml元素中選擇ID

[英]How to select an id from a xml element with linq

這就是我正在使用的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的列表。 我希望有人可以幫助我解決這一問題。

謝謝您的幫助。

這在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);
}

也許這可能是有用的:

  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());
        }

我知道這不適合您的代碼(comboBox),但我想展示如何獲取“ idAsign”節點的值。

基本上,它會執行所有“ idAsign”值。 如果您將它們放在列表中,則很容易獲得特定的列表。

只需獲得especific節點,然后調用以XML格式(如<idAsign>12345</idAsign>

如下

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());

謝謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM