Tôi có câu hỏi liên quan đến việc xóa các nút cụ thể khỏi tệp xml.xóa nút cha không có nút con
Đây là mẫu của tôi về XML:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<nodeA attribute="1">
<nodeB attribute="table">
<nodeC attribute="500"></nodeC>
<nodeC attribute="5"></nodeC>
</nodeB>
<nodeB attribute="3">
<nodeC attribute="4"></nodeC>
<nodeC attribute="5"></nodeC>
<nodeC attribute="5"></nodeC>
</nodeB>
<nodeB attribute="placeHolder">
<nodeB attribute="toRemove">
<nodeB attribute="glass"></nodeB>
<nodeE attribute="7"></nodeE>
<nodeB attribute="glass"></nodeB>
<nodeB attribute="glass"></nodeB>
</nodeB>
</nodeB>
<nodeB attribute="3">
<nodeC attribute="4"></nodeC>
<nodeC attribute="5"></nodeC>
<nodeC attribtue="5"></nodeC>
</nodeB>
<nodeB attribute="placeHolder">
<nodeB attribute="toRemove">
<nodeB attribute="glass"></nodeB>
<nodeE attribute="7"></nodeE>
<nodeB attribute="glass"></nodeB>
<nodeB attribute="glass"></nodeB>
</nodeB>
</nodeB>
</nodeA>
</root>
Tôi muốn loại bỏ nút nodeB="toRemove"
mà không cần tháo trẻ em của nút này. Sau đó tôi cần phải làm điều tương tự với nodeB attribute="placeHolder"
. Một phần của kết quả sẽ trông như thế:
<nodeB attribute="3">
<nodeC attribute="4"></nodeC>
<nodeC attribute="5"></nodeC>
<nodeC attribtue="5"></nodeC>
</nodeB>
<nodeB attribute="glass"></nodeB>
<nodeE attribute="7"></nodeE>
<nodeB attribute="glass"></nodeB>
<nodeB attribute="glass"></nodeB>
Tôi đã cố gắng mã như thế này để đạt được điều đó:
XmlNodeList nodeList = doc.SelectNodes("//nodeB[@attribute=\"toRemove\"]");
foreach (XmlNode node in nodeList)
{
foreach (XmlNode child in node.ChildNodes)
{
node.ParentNode.AppendChild(child);
}
node.ParentNode.RemoveChild(node);
}
doc.Save(XmlFilePathSource);
tôi có thể xác định vị trí nút với thuộc tính mong muốn toRemove hoặc giữ chỗ, tuy nhiên tôi không có thể di chuyển trẻ em của các nút này lên một cấp. Bạn có thể giúp tôi trong trường hợp này? Nó có thể là giải pháp với LINQ, XDocument, XmlReader nhưng tôi thích làm việc với XmlDocument hơn. Cảm ơn bạn đã giúp đỡ bạn có thể cung cấp cho tôi trước.
EDIT:
Trong trường hợp này tôi đã sử dụng mã sửa đổi một chút (để giữ gìn trật tự) mà Chuck Savage viết dưới đây. Một lần để loại bỏ
<nodeB attribute="toRemove"> </nodeB>
và sau đó làm tương tự với
<nodeB attribute="placeHolder"></nodeB>
Dưới đây là hơi đổi mã
XElement root = XElement.Load(XmlFilePathSource);
var removes = root.XPathSelectElements("//nodeB[@attribute=\"toRemove\"]");
foreach (XElement node in removes.ToArray())
{
node.Parent.AddAfterSelf(node.Elements());
node.Remove();
}
root.Save(XmlFilePathSource);
cách tiếp cận XSLT cung cấp bởi @MiMo là rất hữu ích cũng như trong trường hợp này.
Nhiều phần tử 'nodeC' của bạn thiếu thẻ đóng. Bạn có thể cập nhật câu hỏi của mình với xml hợp lệ, được tạo đúng không? –
Tôi đã cập nhật tệp xml được đơn giản hóa của mình. Cảm ơn cho gợi ý, Bây giờ nó dễ đọc hơn cho người khác. – wariacik