将新XML节点添加到混合内容

时间:2011-08-20 10:45:28

标签: c# xml

我想将新节点添加到XML文件中,该文件的架构如下所示:

<?xml version="1.0"?>
<Building>
   <Street>Wood street
      <Number>3
         <Flats>1</Flats>
      </Number>
   </Street> 
</Building>

我想添加一个新建筑(例如,Wood street 5 with 8 flats)。如果街道已经存在,则应该将新子项添加到现有街道。

因此,如果模式存在,模式将如下所示:

<?xml version="1.0"?>
<Building>
   <Street>Wood street
      <Number>3
         <Flats>1</Flats>
      </Number>
      <Number>5
         <Flats>8</Flats>
      </Number>
   </Street> 
</Building>

如果它不存在:

<?xml version="1.0"?>
<Building>
   <Street>Wood street
      <Number>3
         <Flats>1</Flats>
      </Number>
   </Street> 
   <Street>New street
      <Number>5
         <Flats>8</Flats>
      </Number>
   </Street> 
</Building>

我该怎么做?

1 个答案:

答案 0 :(得分:3)

如果使用LINQ to XML,您可以直观地表示这一点。然而,由于内容混合,这将有点尴尬。

如,

var xmlStr = @"<?xml version=""1.0""?>
<Building>
   <Street>Wood street
      <Number>3
         <Flats>1</Flats>
      </Number>
   </Street> 
</Building>
";
var doc = XDocument.Parse(xmlStr);
var newBuilding = new { Street = "Wood Street", Number = "5", Flats = 8 };

// See if the street exists
var street =
   (from e in doc.Element("Building").Elements("Street")
    let streetName = e.Nodes().OfType<XText>().Select(t => t.Value.Trim()).FirstOrDefault()
    where String.Equals(streetName, newBuilding.Street, StringComparison.OrdinalIgnoreCase)
    select e).FirstOrDefault();

if (street != null) // street exists
{
    // add node to the current street
    var newNode =
        new XElement("Number",
            new XText(newBuilding.Number),
            new XElement("Flats", newBuilding.Flats));
    street.Add(newNode);
}
else // street does not exist
{
    // add node to the building list
    var newNode =
        new XElement("Street",
            new XText(newBuilding.Street),
            new XElement("Number",
                new XText(newBuilding.Number),
                new XElement("Flats", newBuilding.Flats)
            )
        );
    doc.Element("Building").Add(newNode);
}