создать узел в документе xml, если он не существует, используя linq to xml - PullRequest
4 голосов
/ 18 августа 2011

Я запрашиваю документ XML с использованием метода XPathSelectElement.

Если узел не существует, я хотел бы вставить узел с этим путем в тот же документ.Родительские узлы также должны быть созданы, если они не существуют.Есть ли простой способ сделать это, не просматривая родителей, проверяя, существуют ли они?(Добавить новый узел, используя XPath)

Ответы [ 2 ]

1 голос
/ 31 августа 2011

Нет, нет ... это ничем не отличается от того, что вы искали каталог в файловой системе и должны были убедиться, что все родительские каталоги были там.

Пример:

if (Directory.Exists(@":c:\test1\test2\blah blah\blah blah2")) ...

Это правда, что метод Directory.CreateDirectory создаст всех родителей, которые должны быть там, чтобы показать ребенка, но в XML нет эквивалента (с использованием классов .NET, включая LINQ-to-XML).

Вам придется перебирать каждый из них вручную.Я предлагаю вам создать вспомогательный метод с именем "EnsureNodeExists", который сделает это за вас:)

0 голосов
/ 09 февраля 2016
static private XmlNode makeXPath(XmlDocument doc, string xpath)
{
   return makeXPath(doc, doc as XmlNode, xpath);
}

static private XmlNode makeXPath(XmlDocument doc, XmlNode parent, string   xpath)
{
// grab the next node name in the xpath; or return parent if empty
string[] partsOfXPath = xpath.Trim('/').Split('/');
string nextNodeInXPath = partsOfXPath.First();
if (string.IsNullOrEmpty(nextNodeInXPath))
    return parent;

// get or create the node from the name
XmlNode node = parent.SelectSingleNode(nextNodeInXPath);
if (node == null)
    node = parent.AppendChild(doc.CreateElement(nextNodeInXPath));

// rejoin the remainder of the array as an xpath expression and recurse
string rest = String.Join("/", partsOfXPath.Skip(1).ToArray());
return makeXPath(doc, node, rest);
}

static void Main(string[] args)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml("<feed />");

makeXPath(doc, "/feed/entry/data");
XmlElement contentElement =   (XmlElement)makeXPath(doc,"/feed/entry/content");
contentElement.SetAttribute("source", "");

Console.WriteLine(doc.OuterXml);
}
...