如何根据XML文档的属性值和XElement对象从XML文档中获取节点?

时间:2012-11-06 22:26:44

标签: c# xml linq-to-xml xelement

我需要将一些XML注入某个节点下的预先存在的XML文件中。这是我创建XML的代码:

//Define the nodes
XElement dataItemNode = new XElement("DataItem");
XElement setterNodeDisplayName = new XElement("Setter");
XElement setterNodeOU = new XElement("Setter");

//Create the tree with the nodes
dataItemNode.Add(setterNodeDisplayName);
dataItemNode.Add(setterNodeOU);

//Define the attributes
XAttribute nameAttrib = new XAttribute("Name", "OrganizationalUnits");
XAttribute displayNameAttrib = new XAttribute("Property", "DisplayName");
XAttribute ouAttrib = new XAttribute("Property", "OU");

//Attach the attributes to the nodes
setterNodeDisplayName.Add(displayNameAttrib);
setterNodeOU.Add(ouAttrib);

//Set the values for each node
setterNodeDisplayName.SetValue("TESTING DISPLAY NAME");
setterNodeOU.SetValue("OU=funky-butt,OU=super,OU=duper,OU=TMI,DC=rompa-room,DC=pbs,DC=com");

以下是我到目前为止加载XML文档并尝试获取我需要插入XML的节点的代码:

//Load up the UDI Wizard XML file
XDocument udiXML = XDocument.Load("UDIWizard_Config.xml");

//Get the node that I need to append to and then append my XML to it
XElement ouNode = THIS IS WHAT I DONT KNOW HOW TO DO
ouNode.Add(dataItemNode);

以下是我尝试使用的现有文档中的XML:

<Data Name="OrganizationalUnits">
        <DataItem>
          <Setter Property="DisplayName">TESTING DISPLAY NAME</Setter>
          <Setter Property="OU">OU=funky-butt,OU=super,OU=duper,OU=TMI,DC=rompa-room,DC=pbs,DC=com</Setter>
        </DataItem>

我有多个名为“Data”的节点,但我需要得到的节点,我不知道如何。只是学习如何在C#中使用XML。

谢谢。

1 个答案:

答案 0 :(得分:3)

这将获得第一个Data节点,其Name属性与 OrganizationalUnits 匹配:

var ouNode = udiXML
    .Descendants("Data")
    .Where(n => n.Attribute("Name") != null)
    .Where(n => n.Attribute("Name").Value == "OrganizationalUnits")
    .First();

如果您的文档可能包含Data个没有Name属性的节点,则可能需要额外检查null。

请注意,您可以使用XPath获得相同的结果(这将选择根Data节点,您可以使用Element方法获取DataItem节点):

var ouNode = udiXML.XPathSelectElement("//Data[@Name = 'OrganizationalUnits']");