从具有特定名称属性的父节点获取节点

时间:2011-12-18 12:29:12

标签: c# .net xml

我有以下XML文档:

<database name="pressPlay">
    <table name="users">
      <column name="userID"       type="INT"            constraints="tableID_c" />
      <column name="username"     type="VARCHAR(50)"    constraints="user_c" />
      <column name="password"     type="VARCHAR(50)"    constraints="not_null_c" />
    </table>
    <table name="song">
      <column name="songID"       type="INT"            constraints="tableID_c" />
      <column name="albumID"      type="INT"            constraints="albumFK_c" />
      <column name="artistID"     type="INT"            constraints="artistFK_c" />
      <column name="songName"     type="VARCHAR(50)"    constraints="not_null_c" />
      <column name="songDuration" type="VARCHAR(5)"     constraints="not_null_c" />
      <column name="link"         type="VARCHAR(100)" />
    </table>
    <table name="album">
      <column name="albumID"      type="INT"            constraints="tableID_c" />
      <column name="albumName"    type="VARCHAR(50)"    constraints="not_null_c" />
      <column name="albumGener"   type="VARCHAR(50)"    constraints="not_null_c" />
    </table>
    <table name="artist">
      <column name="artistID"     type="INT"            constraints="tableID_c" />
      <column name="artistName"   type="VARCHAR(50)"    constraints="not_null_c" />
    </table>

    <constraints>
      <constraint name="tableID_c"    type="unique"     content="not_null" increment="auto"/>
      <constraint name="user_c"       type="unique"     content="not_null"/>
      <constraint name="not_null_c"                     content="not_null"/>
      <constraint name="albumFK_c"    type="forign_key" content="not_null" columns="album.albumID" />
      <constraint name="artistFK_c"   type="forign_key" content="not_null" columns="artist.artistID" />
    </constraints>    
</database>

现在我需要的是从共享具有特定名称属性的父节点的节点获取属性。

我尝试使用XmlNodeList但是这给了我所有名为column的节点,而不管父母的名字是什么,即:

我需要列节点的名称属性,父名称是用户。

谁知道怎么做?我现在已经把头埋了一会儿..

3 个答案:

答案 0 :(得分:3)

类似的东西:

XmlDocument inventory = new XmlDocument();
inventory.Load("inventory.xml");

XmlNodeList elements = inventory.SelectNodes("/XMLProject/table[@name='users']/column");
foreach (XmlElement element in elements)
{
    ...
}

这会给你:

<column name="userID"       type="INT"            constraints="tableID_c" />
<column name="username"     type="VARCHAR(50)"    constraints="user_c" />
<column name="password"     type="VARCHAR(50)"    constraints="not_null_c" />

现在,您可以浏览每个属性并获取其属性。

答案 1 :(得分:3)

Linq中有这样的东西吗?

IEnumerable<string> names =
    from x in XDocument.Load(@"project.xml").Descendants("column")
    where x.Parent.Attribute("name").Value.Equals("users", StringComparison.Ordinal)
    select x.Attribute("name").Value;

答案 2 :(得分:2)

http://msdn.microsoft.com/en-us/library/bb387098.aspx

在这种情况下,我实际上会使用LinqToXML;

XDocument document = XDocument.Load("mydocument")

var table = (from n in document.Descendants("table")
             where n.Attribute("name").Value == "users"
             select n).Single( );

var columns = from c in table.Descendants("column")
               select c.Attribute("name").Value;

这是一个粗略的版本,我确信有一种方法可以将它们折叠成一个查询。我发现LinqToXml更容易使用。