【问题标题】:Easier way to add elements in XML using LINQ使用 LINQ 在 XML 中添加元素的更简单方法
【发布时间】:2012-05-02 19:42:32
【问题描述】:

目前我正在使用带有 linq to xml 的 xpath 在 xml 文档中的特定元素之后添加元素。 我担心的是如果这个层次结构太深,我必须总是提到完整的层次结构? 我不能以某种方式直接给出元素的名称,然后我想添加我的新元素。

在这段代码中,我谈论的是这个层次结构: SESSIONANALYSER/AP/MODES/NI/STATEINFORMATION/INIT/INPUT[@VALUE='SLN7DEACTIVATION']/METHOD

String strFile = File.ReadAllText(Server.MapPath("~/SessionAnalyserAccessories.xml"));
            XDocument xdoc1 = XDocument.Parse(strFile);
            xdoc1.XPathSelectElement("SESSIONANALYSER/AP/MODES/NI/STATEINFORMATION/INIT/INPUT[@VALUE='SLN7DEACTIVATION']/METHOD").AddAfterSelf(new XElement("METHOD", "", new XAttribute("NAME", "CHECKSUBSCRIBERBALANCE1"), new XAttribute("PARAMETERS", "SLN7"), new XAttribute("POSSIBLEACTIONS1", "FALLOUTON_FAILUREREGION_SETPSOFAILED_FALSE1"), new XAttribute("MAINTAINSESSION", "NO"), new XAttribute("RESPONSE", "-4"), new XAttribute("NEXTLEVEL", "")));

【问题讨论】:

    标签: .net linq-to-xml


    【解决方案1】:

    使用 XPath,您可以使用 descendant::INPUT[@VALUE='SLN7DEACTIVATION']/METHOD//INPUT[@VALUE='SLN7DEACTIVATION']/METHOD 查找任何级别的元素,因此如果您确定只有一个这样的元素,您可以通过这种方式缩短路径。但是,如果所有祖先都对识别元素很重要,则使用长路径。

    附带说明,而不是

    String strFile = File.ReadAllText(Server.MapPath("~/SessionAnalyserAccessories.xml"));
    XDocument xdoc1 = XDocument.Parse(strFile);
    

    简单地做

    XDocument xdoc1 = XDocument.Load(Server.MapPath("~/SessionAnalyserAccessories.xml"));
    

    这允许 XML 解析器在文档的 XML 声明中找到正确的编码,并且应该通过不首先读取包含所有 XML 的冗长字符串来提高效率。

    【讨论】:

    • 太棒了!我现在正在使用此代码,我对此有疑问。这段代码找到一个匹配的元素,然后插入新元素,如果我想在所有匹配的元素之后添加元素,这段代码在第一次匹配后停止。 xdoc1.XPathSelectElement("//INPUT[@]/METHOD").AddAfterSelf(new XElement("METHOD", "", new XAttribute("NAME", Parameters[0]), new XAttribute("PARAMETERS", Parameters[1]), new XAttribute("POSSIBLEACTIONS1", "Parameters[2]"), new XAttribute("MAINTAINSESSION", Parameters[3]), new XAttribute("RESPONSE", Parameters[4]), new XAttribute("NEXTLEVEL", Parameters[5])));
    • 好吧,如果您希望找到多个元素,您可以使用 XPathSelectElements 代替并在返回的节点上使用 foreach 循环。此外,由于您既要查找又要插入 METHOD 元素,您需要首先调用 ToList 例如foreach (XElement method in xdoc1.XPathSelectElements("//INPUT[@VALUE='SLN7DEACTIVATION']/METHOD").ToList()) { method.AddAfterSelf(...); }.
    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    相关资源
    最近更新 更多