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 の使用にあまり慣れていないので、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

私はこれがあなたが望むことをするだろうと信じています:

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.

于 2012-06-07T20:33:36.240 に答える
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 に答える