4

这是我的 XML 示例。我想选择 SystemSetting 的值 if ID = 123。但我不知道怎么做。SystemSetting如果 id 的值等于 123,我该如何选择值?

<?xml version="1.0" encoding="utf-8" ?>
<Private>
  <System>
    <ID>123</ID>
    <NAME>Test</NAME>
    <SystemSetting>128</SystemSetting>
    <SystemSettingCS>127</SystemSettingCS>
  </System> 
  <System>
    <ID>124</ID>
    <NAME>Test2</NAME>
    <SystemSetting>128</SystemSetting>
    <SystemSettingCS>127</SystemSettingCS>
  </System>
  <System>
    <ID>0</ID>
    <NAME>Test</NAME>   
    <SystemSetting>5</SystemSetting>
    <SystemSettingCS>250</SystemSettingCS>
  </System>
</Private>

这是我尝试过的:

    var doc = XDocument.Load(Application.StartupPath+  @"\Settings.xml");
    var q = from Ana in doc.Descendants("Private")                   
            from sistem in Ana.Elements("System")                   
            where (int)sistem.Element("ID") == 123
            from assetText in Sistem.Elements("System")
            select assetText.Element("SystemSetting");

    MessageBox.Show(q.ToString());

谢谢帮助。

4

5 回答 5

2

我认为你让这比你需要的更复杂。我想你只需要:

var query = doc.Descendants("Private") // Or just doc.Root
               .Elements("System")
               .Where(x => (int) x.Element("ID") == 123)
               .Select(x => x.Element("SystemSetting"))
               .FirstOrDefault();

诚然,这将选择第一个匹配元素。那么的类型queryXElement; 如果您取下FirstOrDefault()零件,它将IEnumerable<XElement>为所有匹配的元素返回一个 , 。

如果您只想要值而不是元素,则可以将其更改Select为:

.Select(x => (string) x.Element("SystemSetting"))

或者

.Select(x => x.Element("SystemSetting").Value)

null(如果没有元素,第一个将返回SystemSetting;第二个将抛出异常。)

于 2012-11-28T16:11:30.420 回答
1

Xpath ( System.Xml.XPath ) 在这里真的可以提供帮助

var system = doc.XPathSelectElement("//System[ID[text()='123']]");
var val = system.Element("SystemSetting").Value;

或单行

var s = (string)doc.XPathSelectElement("//System[ID[text()='123']]/SystemSetting");
于 2012-11-28T16:13:25.413 回答
0

是一个 Linq 问题,但有另一种 XPath 方法,但下面定义的类可以在任何一种情况下工作。

定义一个从父 System 元素中读取的类:

public class XSystem
{
   public XSystem(XElement xSystem) { self = xSystem; }
   XElement self;

   public int Id { get { return (int)self.Element("ID"); } }
   public string Name { get { return self.Element("NAME").Value; } }
   public int SystemSetting { get { return (int)self.Element("SystemSetting"); } }
   public int SystemSettingCS { get { return (int)self.Element("SystemSettingCS"); } }
}

然后找到具有子ID元素123的System元素。

int id = 123;
string xpath = string.Format("//System[ID={0}", id);
XElement x = doc.XPathSelectElement(xpath);

然后将其插入类中:

XSystem system = new XSystem(x);

然后读取你想要的值:

int systemSetting = system.SystemSetting; 

XPath 定义为using System.Xml.XPath;

于 2012-11-28T18:01:52.163 回答
0
 var q = from s in doc.Descendants("System")  
         where (int)s.Element("ID") == 123        
         select (int)s.Element("SystemSetting");

并显示结果(q将有IEnumerable<int>类型):

if (q.Any())
    MessageBox.Show("SystemSettings = " + q.First());
else
    MessageBox.Show("System not found");
于 2012-11-28T16:13:01.547 回答
0

你快到了

var xmlFile = XElement.Load(@"c:\\test.xml");

var query =
  from e in xmlFile.Elements()
  where e.Element("ID").Value == "123"
  select e.Element("SystemSetting").Value;
于 2012-11-28T16:17:03.720 回答