2016-04-27 27 views
0

のためのノードをテストしながら、C#はXMLで前のノードの子の特定の属性を取得し、私はxliffを持っていると私はsourceの最後x要素のid属性の値を取得しようとしています前のtrans-unitは、子がtargetでない限りです。不足している要素

非常に具体的には、すべての要素を返す必要はありませんが、親ノードを取得して、前の要素にtarget要素があるかどうかをテストし、そうであればnullを返します。最後の子のidの属性は、source要素のxです。

更新: xliffにはtrans-unitsが多数ありますが、以下は単なるスニペットです。私は<mrk mtype="seg" mid="6">要素(そのmid属性を使用)に基づいて特定のものを見つけて、ターゲットがない場合は前のノードの子を取得する必要があります。あなたは私が取得しようとしていますか見てここ

は、XMLの抜粋です:

<?xml version="1.0" encoding="utf-8"?> 
<xliff xmlns:sdl="http://sdl.com/FileTypes/SdlXliff/1.0" version="1.2" sdl:version="1.0" xmlns="urn:oasis:names:tc:xliff:document:1.2"> 
<!-- xliff goes on here --> 
    <trans-unit id="495bbe35-ad63-4d37-91e0-8261c2e4052e" translate="no"> 
    <source> 
     <x id="11" /> 
     <x id="12" />  <!-- THIS IS THE ID I WANT TO GET --> 
    </source> 
    </trans-unit> 
    <trans-unit id="5bccf5f4-56c9-4969-8416-f3114eb36e86"> 
    <source> 
     <x id="13" />SOME TEXT 
    </source> 
    <seg-source> 
     <mrk mtype="seg" mid="6">  <!-- THIS IS THE MID I WANT TO START FROM --> 
     <x id="13" />SOME TEXT 
     </mrk> 
    </seg-source> 
    <target> 
     <mrk mtype="seg" mid="6"> 
     <x id="13" />SOME TRANSLATION 
     </mrk> 
    </target> 
    <sdl:seg-defs> 
     <sdl:seg id="6" conf="ApprovedTranslation" origin="interactive" /> 
    </sdl:seg-defs> 
    </trans-unit> 

だからこのケースでは、私は"12"が返さたいです。目標があれば、私はnullになるはずです。

は、私は次のコード行で全体のノードを返すことに成功したが、私は子供たちに取得することができていないようです。さらに、その後

xliff = XDocument.Load(Path.GetFullPath(FilePath)); 
XNamespace xmlns = "urn:oasis:names:tc:xliff:document:1.2"; 
XNamespace ns = "http://sdl.com/FileTypes/SdlXliff/1.0"; 
string testid = xliff.Descendants() 
        .Elements(xmlns + "trans-unit") 
        .Elements(xmlns + "seg-source") 
        .Elements(xmlns + "mrk") 
        .Where(e => e.Attribute("mtype").Value == "seg" && e.Attribute("mid").Value == SegId) 
        .FirstOrDefault().Parent.Parent.PreviousNode.ToString(); 

これは大丈夫前のノードを返しますが、私はこれを持っていますが、例外がスローされます:

string testid = xliff.Descendants() 
        .Elements(xmlns + "trans-unit") 
        .Elements(xmlns + "seg-source") 
        .Elements(xmlns + "mrk") 
        .Where(e => e.Attribute("mtype").Value == "seg" && e.Attribute("mid").Value == SegId) 
        .Select(n => n.Parent.Parent.PreviousNode as XElement) 
        .Where(c => c.Elements(xmlns + "target") == null && c.Elements(xmlns + "source").Elements(xmlns + "x").Last().Value != null) 
        .FirstOrDefault().Attribute("id").Value; 

誰かが助けてくれますか?

+1

可能[c#のxmlの親要素にあるすべての子要素を取得する方法]の複製(http://stackoverflow.com/questions/34941152/how-to-get-all-child-elements-in-the-parent-element -of-xml-in-c-sharp) – MethodMan

+0

ありがとうございました。私もこれをチェックして、私は方向を進めることができた。コードの更新を見てくださいが、前の 'trans-unit'に' target'要素がなく、 'source'要素の最後の子の' id'属性を返すのを実際にテストしようとしています。ですから、問題は単にすべての要素を返すことよりも複雑です。それは既に行われています。 – ib11

答えて

0

が、私は最終的に私が望むまさに行い、次のコードを思い付いた作品が、私は、LINQでこれを行うためのスムーズな方法があるはずだと思う:

XElement testid = xliff.Descendants() 
         .Elements(xmlns + "trans-unit") 
         .Elements(xmlns + "seg-source") 
         .Elements(xmlns + "mrk") 
         .Where(e => e.Attribute("mtype").Value == "seg" && e.Attribute("mid").Value == SegId).FirstOrDefault(); 

if (testid.Parent.Parent.PreviousNode.ToString().IndexOf("<target>") > 0) 
{ 
    return null; 
} 
else 
{ 
    var strid = xliff.Descendants() 
        .Select(e => testid.Parent.Parent.PreviousNode as XElement) 
        .Elements(xmlns + "source") 
        .Elements(xmlns + "x") 
        .LastOrDefault() 
        .Attribute("id") 
        .Value.ToString(); 
    return strid; 
} 
1

これは

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XDocument doc = XDocument.Load(FILENAME); 
      XElement xliff = (XElement)doc.FirstNode; 
      XNamespace ns = xliff.Name.Namespace; 
      var testid = xliff.Descendants(ns + "trans-unit") 
       .Where(x => x.Element(ns + "target") == null) 
       .Descendants(ns + "x") 
       .Select(y => y.Attribute("id").Value) 
       .Last(); 

     } 
    } 
} 
+0

うわー。ありがとうございました。ちょうど私のコードを投稿した。私はあなたの答えを自然に票決しました。私ははっきりしていませんでしたが、xliffにはこのようなトランスユニットがたくさんあります。私は ''要素に基づいて特定のものを見つけて、ターゲットがない場合は前のノードの子を取得する必要があります。 (私はそれを明確にするために質問を編集しました) – ib11

+0

意味私は出発点を持っています。 – ib11

関連する問題