我是C#的初学者。
更大案例的简单例子:
输入:
<?xml version="1.0" encoding="utf-8"?>
<products>
<product>
<id>1</id>
<name>John</name>
</product>
<product>
<id>2</id>
<name>Tom</name>
</product>
<product>
<id>3</id>
<name>Sam</name>
</product>
</products>
</xml>
输出(id = 1):
<id>2</id>
<name>Tom</name>
我的部分代码尝试psedocode:
XDocument doc=XDocument.Parse(".............");
var els= doc.Descendants("product");
foreach(e in els){
node=e.Element("id");
if(2==node.Value){
return e;
}
}
请帮忙,
由于
答案 0 :(得分:4)
目前您的xml文件格式不正确 - 从文件中删除关闭</xml>
标记以使其有效。这是查询:
int id = 1;
XDocument xdoc = XDocument.Load(path_to_xml);
var product = xdoc.Descendants("product")
.Where(p => (int)p.Element("id") == id)
.SingleOrDefault();
如果找不到匹配项,此查询将返回整个<product>
元素或null
。
另外我相信产品名称足以让您选择(因为您已经有产品ID):
var name = xdoc.Descendants("product")
.Where(p => (int)p.Element("id") == id)
.Select(p => (string)p.Element("name"))
.SingleOrDefault();
返回Tom
id = 2
答案 1 :(得分:1)
您可能正在寻找XPath:
root.XPathSelectElements(@"//products/product/id[text()='2']")
修改评论:直接获取名称://products/product/id[text()='2']/../name
参见完整示例
using System.Xml.Linq;
using System.Xml.XPath;
public class Program
{
public static void Main(string[] args)
{
var doc = XDocument.Parse(XML);
foreach(var n in doc.Root.XPathSelectElements(
@"//products/product/id[text()='2']"))
{
System.Console.WriteLine("Not that hard: '{0}'", n.Parent.Element("name").Value);
}
// Direct query for name:
foreach(var n in doc.Root.XPathSelectElements(
@"//products/product/id[text()='2']/../name"))
{
System.Console.WriteLine("Directly: '{0}'", n.Value);
}
}
private const string XML =
@"<?xml version=""1.0"" encoding=""utf-8""?>
<products>
<product>
<id>1</id>
<name>John</name>
</product>
<product>
<id>2</id>
<name>Tom</name>
</product>
<product>
<id>3</id>
<name>Sam</name>
</product>
</products>";
}
印刷:
Not that hard: 'Tom'
Directly: 'Tom'
答案 2 :(得分:1)
这将返回product
(如您的问题中)而不是id
var product = doc.XPathSelectElement("//product[id and id[text() = '1']]");