2012-02-02 2 views
2

文字列を比較するために、私は、文字列を受け取り、コードの一部を記述しようとしているが、別の文字列に変更を加えるには、この文字列内のデータを使用していますし、私が何を好む他の文字列LINQの

を節約これは私が多少それに精通しているのでlinqを使っていますが、それは私が完全に精通していると言っているわけではありません。

とにかく、受信された文字列は、例えば、

"<?xml version=\"1.0\" encoding=\"utf-8\"?><Root><Value><Code>AAA</Code><Description>First description</Description><Bool>Y</Bool></Value><Value><Code>BBB</Code><Description>Second description</Description><Bool>Y</Bool></Value><Value><Code>CCC</Code><Description>Third description</Description><Bool>N</Bool></Value></Root>"; 

ような形で、または適切なフォーマット

"<?xml version=\"1.0\" encoding=\"utf-8\"?> 
    <Root> 
     <Value> 
      <Code>AAA</Code> 
      <Description>First description</Description> 
      <Bool>Y</Bool> 
     </Value> 
     <Value> 
      <Code>BBB</Code> 
      <Description>Second description</Description> 
      <Bool>Y</Bool> 
     </Value> 
     <Value> 
      <Code>CCC</Code> 
      <Description>Third description</Description> 
      <Bool>N</Bool> 
     </Value> 
    </Root>" 

であり、。私がしたいすべてのNにBOOLが設定されたすべてのコードを見つけて、それらのBoolsを設定することで、同じ形のように、より多くの値を持つとYに設定されているすべてのBoolsで他の値が

"<?xml version=\"1.0\" encoding=\"utf-8\"?> 
    <Root> 
     <Value> 
      <Code>111</Code> 
      <Description>111 description</Description> 
      <Bool>Y</Bool> 
     </Value> 
     <Value> 
      <Code>AAA</Code> 
      <Description>First description</Description> 
      <Bool>Y</Bool> 
     </Value> 
     <Value> 
      <Code>222</Code> 
      <Description>222 description</Description> 
      <Bool>Y</Bool> 
     </Value> 
     <Value> 
      <Code>BBB</Code> 
      <Description>Second description</Description> 
      <Bool>Y</Bool> 
     </Value> 
     <Value> 
      <Code>333</Code> 
      <Description>333 description</Description> 
      <Bool>Y</Bool> 
     </Value> 
     <Value> 
      <Code>CCC</Code> 
      <Description>Third description</Description> 
      <Bool>Y</Bool> 
     </Value> 
    </Root>" 

のようなものですN.

に新しいXMLので、これらの両方を組み合わせた結果が、新しいXMLになりますが、コードのCCCとの値がブール値がそうN.として設定しなければならない上:

"<?xml version=\"1.0\" encoding=\"utf-8\"?> 
    <Root> 
     <Value> 
      <Code>111</Code> 
      <Description>111 description</Description> 
      <Bool>Y</Bool> 
     </Value> 
     <Value> 
      <Code>AAA</Code> 
      <Description>First description</Description> 
      <Bool>Y</Bool> 
     </Value> 
     <Value> 
      <Code>222</Code> 
      <Description>222 description</Description> 
      <Bool>Y</Bool> 
     </Value> 
     <Value> 
      <Code>BBB</Code> 
      <Description>Second description</Description> 
      <Bool>Y</Bool> 
     </Value> 
     <Value> 
      <Code>333</Code> 
      <Description>333 description</Description> 
      <Bool>Y</Bool> 
     </Value> 
     <Value> 
      <Code>CCC</Code> 
      <Description>Third description</Description> 
      <Bool>N</Bool> 
     </Value> 
    </Root>" 

私にそれXMLにLinqを使ってこれを行う信じられないほど簡単な方法があるはずだが、私はそれはしばらくの間、私はこれに関するかなりの問題を抱えているので、XMLの私の未経験が表示されているようです。

ご協力いただければ幸いです。

ありがとうございました

+0

xpathはlinqからxmlよりはるかに簡単です。それはjquery – Bonshington

+1

のLINQ to XMLに似たユーザセレクタです。MSDNの基礎から始めてください。http://msdn.microsoft.com/en-us/library/bb387098.aspx – Lloyd

答えて

2

これは何ですか?あなたの最初のXMLは、「doc1.xml」に格納された2つ目の中に格納されている場合

string srcString = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Root><Value><Code>AAA</Code><Description>First description</Description><Bool>Y</Bool></Value><Value><Code>BBB</Code><Description>Second description</Description><Bool>Y</Bool></Value><Value><Code>CCC</Code><Description>Third description</Description><Bool>N</Bool></Value></Root>"; 
string targetString = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Root><Value><Code>111</Code><Description>111 description</Description><Bool>Y</Bool></Value><Value><Code>AAA</Code><Description>First description</Description><Bool>Y</Bool></Value><Value><Code>222</Code><Description>222 description</Description><Bool>Y</Bool></Value><Value><Code>BBB</Code><Description>Second description</Description><Bool>Y</Bool></Value><Value><Code>333</Code><Description>333 description</Description><Bool>Y</Bool></Value><Value><Code>CCC</Code><Description>Third description</Description><Bool>Y</Bool></Value></Root>"; 

XDocument srcDocument = XDocument.Parse(srcString); 
XDocument targetDocument = XDocument.Parse(targetString); 

// find all Value-elements with Bool = 'N' from the srcString 
var srcData = from data in srcDocument.Element("Root").Elements("Value") 
       where string.Compare(data.Element("Bool").Value.ToString(), "N", true) == 0 
       select new { Code = data.Element("Code").Value, 
          Description = data.Element("Description").Value, 
          Bool = data.Element("Bool").Value }; 

foreach(var item in srcData) 
{ 
    var xmlData = from data in targetDocument.Element("Root").Elements("Value") 
        where string.Compare(data.Element("Code").Value.ToString(), item.Code, true) == 0 
        select data; 

    foreach(var data in xmlData) 
    { 
     data.Element("Bool").Value = "N"; 
    } 
} 

var finalString = targetDocument.ToString(); 
+0

パーフェクト、 "var xmlDocument = new XDocument (新しいXDeclaration( "1.0"、 "utf-8"、null)、新しいXElement( "宣言を維持するために"これは完璧な解決策です。 – user360968

0

は、別の解決策が、その多くのLINQを使用してLINQでそれをやっていないようです「doc2.xml」、あなたは、単にこれを行うことによって、あなたの目標を達成することができます

XElement doc1 = XElement.Load("doc1.xml"); 
XElement doc2 = XElement.Load("doc2.xml"); 

var pairs = from v1 in doc1.Elements("Value") 
    join v2 in doc2.Elements("Value") 
    on v1.Element("Code").Value equals v2.Element("Code").Value 
    select new {v1, v2}; 

foreach (var pair in pairs) 
    pair.v1.Element("Bool").Value = pair.v2.Element("Bool").Value; 

上記のコードは、doc2に基づいdoc1を操作します。その結果を "doc3.xml"のような新しいファイルに保存することができます。

doc1.Save("doc3.xml"); 
0

:ここ

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

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static XElement Join(XElement xmlOne, XElement xmlTwo) 
     { 
      return new XElement(
       "Root", 
        xmlOne.Elements("Value").Concat(xmlTwo.Elements("Value")).GroupBy(element => element.Element("Code").Value).Select(
         group => 
          new XElement("Value", 
           new XElement("Code", group.First().Element("Code").Value), 
           new XElement("Description", group.First().Element("Description").Value), 
           new XElement("Bool", group.Any(elem => elem.Element("Bool").Value == "N") ? "N" : "Y"))).ToArray()); 

     } 

     static void Main(string[] args) 
     { 
      var xmlOne = XElement.Parse("<?xml version=\"1.0\" encoding=\"utf-8\"?> <Root>  <Value>   <Code>AAA</Code>   <Description>First description</Description>   <Bool>Y</Bool>  </Value>  <Value>   <Code>BBB</Code>   <Description>Second description</Description>   <Bool>Y</Bool>  </Value>  <Value>   <Code>CCC</Code>   <Description>Third description</Description>   <Bool>N</Bool>  </Value> </Root>"); 
      var xmlTwo = XElement.Parse("<?xml version=\"1.0\" encoding=\"utf-8\"?> <Root>  <Value>   <Code>111</Code>   <Description>111 description</Description>   <Bool>Y</Bool>  </Value>  <Value>   <Code>AAA</Code>   <Description>First description</Description>   <Bool>Y</Bool>  </Value>  <Value>   <Code>222</Code>   <Description>222 description</Description>   <Bool>Y</Bool>  </Value>  <Value>   <Code>BBB</Code>   <Description>Second description</Description>   <Bool>Y</Bool>  </Value>  <Value>   <Code>333</Code>   <Description>333 description</Description>   <Bool>Y</Bool>  </Value>  <Value>   <Code>CCC</Code>   <Description>Third description</Description>   <Bool>Y</Bool>  </Value> </Root>"); 
      var result = Join(xmlOne, xmlTwo); 
     } 
    } 
}