Результаты поиска
Найдено результатов: 2
Загрузить XmlNodeList в XmlDocument без цикла?
Я изначально задал этот вопрос на RefactorMyCode, но там не получил ответа...
В принципе, я просто пытаюсь загрузить XmlNodeList в XmlDocument , и мне было интересно, есть ли более эффективный метод, чем цикл.
Private Function GetPreviousMonthsXml(ByVal months As Integer, ByVal startDate As Date, ByVal xDoc As XmlDocument, ByVal path As String, ByVal nodeName As String) As XmlDocument
'' build xpath string with list of months to return
Dim xp As New StringBuilder("//")
xp.Append(nodeName)
xp.Append("[")
For i As Integer = 0 To (months - 1)
'' get year and month portion of date for datestring
xp.Append("starts-with(@Id, '")
xp.Append(startDate.AddMonths(-i).ToString("yyyy-MM"))
If i < (months - 1) Then
xp.Append("') or ")
Else
xp.Append("')]")
End If
Next
'' *** This is the block that needs to be refactored ***
'' import nodelist into an xmldocument
Dim xnl As XmlNodeList = xDoc.SelectNodes(xp.ToString())
Dim returnXDoc As New XmlDocument(xDoc.NameTable)
returnXDoc = xDoc.Clone()
Dim nodeParents As XmlNodeList = returnXDoc.SelectNodes(path)
For Each nodeParent As XmlNode In nodeParents
For Each nodeToDelete As XmlNode In nodeParent.SelectNodes(nodeName)
nodeParent.RemoveChild(nodeToDelete)
Next
Next
For Each node As XmlNode In xnl
Dim newNode As XmlNode = returnXDoc.ImportNode(node, True)
returnXDoc.DocumentElement.SelectSingleNode("//" & node.ParentNode.Name & "[@Id='" & newNode.Attributes("Id").Value.Split("-")(0) & "']").AppendChild(newNode)
Next
'' *** end ***
Return returnXDoc
End Function
Удаление узлов из XmlDocument
Следующий код должен найти соответствующий тег проекта и удалить его из XmlDocument, однако когда я тестирую его, он говорит::
Узел, который нужно удалить, не является дочерним для этого узла.
Кто-нибудь знает, как правильно это сделать?
public void DeleteProject (string projectName)
{
string ccConfigPath = ConfigurationManager.AppSettings["ConfigPath"];
XmlDocument configDoc = new XmlDocument();
configDoc.Load(ccConfigPath);
XmlNodeList projectNodes = configDoc.GetElementsByTagName("project");
for (int i = 0; i < projectNodes.Count; i++)
{
if (projectNodes[i].Attributes["name"] != null)
{
if (projectName == projectNodes[i].Attributes["name"].InnerText)
{
configDoc.RemoveChild(projectNodes[i]);
configDoc.Save(ccConfigPath);
}
}
}
}
UPDATE
Исправлено. Я сделал две вещи:
XmlNode project = configDoc.SelectSingleNode("//project[@name='" + projectName + "']");
Заменил цикл For запросом XPath, который не был предназначен для его исправления, просто потому, что это был лучший подход.
Фактическое исправление было:
project.ParentNode.RemoveChild(project);
Спасибо Пэту и Чаку за это предложение.