のためのノードをテストしながら、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;
誰かが助けてくれますか?
可能[c#のxmlの親要素にあるすべての子要素を取得する方法]の複製(http://stackoverflow.com/questions/34941152/how-to-get-all-child-elements-in-the-parent-element -of-xml-in-c-sharp) – MethodMan
ありがとうございました。私もこれをチェックして、私は方向を進めることができた。コードの更新を見てくださいが、前の 'trans-unit'に' target'要素がなく、 'source'要素の最後の子の' id'属性を返すのを実際にテストしようとしています。ですから、問題は単にすべての要素を返すことよりも複雑です。それは既に行われています。 – ib11