查询XML文档

时间:2013-06-14 06:30:51

标签: c# xml linq

我有这种格式的XML文档

<User 1>
<sub>text1</sub>
<sub>text2</sub>
</User 1>

<User 2>
<sub>text3</sub>
<sub>text4</sub>
</User 2>

<User 3>
<sub>text2</sub>
<sub>text3</sub>
</User 3>

<User 4>
<sub>text1</sub>
<sub>text4</sub>
</User 4>

此处所有用户节点都有子节点,其值为text1,text2等,具体取决于其要求。我想显示这些值,我该怎么做?我可以像这样创建XML并显示值吗?当我尝试它时说没有名称为“sub”的属性。

[编辑] 我有根元素,我之前没有提到过。 在您回答之前,我使用下面的代码从用户那里获取一个值

    DataSet ds = new DataSet();
    ds.ReadXml(Server.MapPath("usermachine.xml"));
    DropDownList2.DataTextField = "sub";
    DropDownList2.DataValueField = "userid";
    DropDownList2.DataSource = ds;
    DropDownList2.DataBind();

如果我想在DropDownList中显示特定用户的(子)内的一个或多个值,我该怎么办?

1 个答案:

答案 0 :(得分:2)

您没有使用有效的XML

首先你需要有一个根节点,用户ID应该在这样的属性中

<Users>
   <User id="1">
      <sub>text1</sub>
      <sub>text2</sub>
   </User>

   <User id="2">
      <sub>text3</sub>
      <sub>text4</sub>
   </User>

   <User id="3">
      <sub>text2</sub>
      <sub>text3</sub>
   </User>

   <User id="4">
      <sub>text1</sub>
      <sub>text4</sub>
  </User>
</Users>

正确格式化XML后,您可以像这样查询

var doc = XDocument.Load(@"c:\temp\test.xml");
var user = doc.Descendants("User").Where(x=>x.Attribute("id").Value =="1")
                                  .Select(x=>x.Value);

回答您添加的问题

沿着这些方向的某些内容会使其映射到下拉列表

var doc = XDocument.Load(@"c:\temp\test.xml");
var user = doc.Descendants("User").Select(x=>new {UserId = x.Attribute("id").Value, Sub=x.Element("sub").Value});

DropDownList1.DataSource = "user";
DropDownList1.DataTextField= "UserId";
DropDownList1.DataValueField = "Sub";

如果您希望每个用户的下拉列表中有多个项目,则每个子项都可以使用一个

var result = res.Descendants("sub")
                .Select(x => new {UserId = x.Parent.Attribute("id").Value, Sub = x.Value});