2

我有以下格式的 xml 文档:

<body>
    <par id = "1">
      <prop type="Content">One</prop>
      <child xml:id="1">
        <span>This is span 1</span>
      </child>
      <child xml:id="2">
        <span>This is span 2</span>
      </child>
    </par>
</body>

我对使用 LINQ 不是很熟悉,我想用它来交换上述代码的元素。(即,我想搬家

<span>This is span 2</span>

进入

<child xml:id="1"></child>

元素树,反之亦然)

我正在浏览http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b上的示例,但我真的很想朝着正确的方向进一步推进(老实说,我很难弄清楚从哪儿开始!)。

谢谢!

4

3 回答 3

1

您可以使用 Linq to sml 查询选择特定元素

   var  retmodule = (from c in xdoc.Elements("body").Elements("par").Elements("child").
                             where c.Attribute("xml:id").Value == 2
                             select new 
                             {
                              c.Element("span").Value
                             }).SingleOrDefault();

然后使用 xpath 和 xml 库的组合插入它

XElement parentXElement = xmldoc.XPathSelectElement("products");
XElement refXElement = xdoc.XPathSelectElement("body/par/child [@xml:id = '2']");
XElement newXElement = new XElement("span", retmodule.ToString());
refXElement.AddAfterSelf(newXElement);
xdoc.Save();
于 2012-06-07T20:05:26.017 回答
1

我相信这会做你想要的:

using System;
using System.Xml;
using System.Xml.Linq;
using System.Xml.XPath;

namespace Example
{
    class Program
    {
        static void Main(string[] args)
        {
            string xml = @"
<body>
    <par id = ""1"">
      <prop type=""Content"">One</prop>
      <child xml:id=""1"">
        <span>This is span 1</span>
      </child>
      <child xml:id=""2"">
        <span>This is span 2</span>
      </child>
    </par>
</body>";
            XDocument doc = XDocument.Parse(xml);
            XmlNamespaceManager namespaceManager = new XmlNamespaceManager(doc.CreateNavigator().NameTable);
            namespaceManager.AddNamespace("xml", "http://www.w3.org/XML/1998/namespace");
            XElement span1 = doc.Root.XPathSelectElement(@"/body/par/child[@xml:id = ""1""]/span[1]", namespaceManager);
            XElement span2 = doc.Root.XPathSelectElement(@"/body/par/child[@xml:id = ""2""]/span[1]", namespaceManager);

            span1.ReplaceWith(span2);
            span2.ReplaceWith(span1);

            Console.WriteLine(doc);
        }
    }
}
于 2012-06-07T20:16:34.157 回答
1

可以使用 LINQ,但它实际上是用于查询,而不是修改。从技术上讲,您可以编写一个查询来为您提供所需的结果,但这会相当难看。

我建议将字符串加载到 XMLDocument 中并使用 XPath 交换节点:

    private static string swap(string xml)
    {
        XmlDocument xDoc = new XmlDocument();
        xDoc.LoadXml(xml);

        XmlNamespaceManager namespaceManager = new XmlNamespaceManager(xDoc.NameTable);
        namespaceManager.AddNamespace("xml", "http://www.w3.org/XML/1998/namespace");  

        var node1 = xDoc.SelectSingleNode(@"//child[@xml:id=""1""]",namespaceManager);
        var node2 = xDoc.SelectSingleNode(@"//child[@xml:id=""2""]",namespaceManager);

        var temp = node1.InnerXml;
        node1.InnerXml = node2.InnerXml;
        node2.InnerXml = temp;

        return xDoc.OuterXml;
    }

请注意,您需要使用 XmlNamespaceManager 来考虑文档中的“xml”命名空间(我假设它是在其他地方定义的)。

于 2012-06-07T20:33:36.240 回答