我想将新节点添加到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>
我该怎么做?
答案 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);
}