2014-10-16 2 views
0

У меня есть память переводов, которая по существу является файлом XML на основе спецификаций формата конвертации Translation Memory, и я пытаюсь найти конкретную единицу перевода для редактирования. Это пример структуры:Найти пары единиц перевода в файле tmx

<?xml version="1.0" encoding="utf-8"?> 
    <tmx version="1.4"> 
    <header creationtool="xxx" .... /> 
    <body> 
    <tu tuid="1"> 
     <tuv xml:lang="en-US"> 
     <seg>sample source</seg> 
     </tuv> 
     <tuv xml:lang="de-DE"> 
     <seg>sample translation</seg> 
     </tuv> 
    </tu> 
    <tu tuid="2"> 
     <tuv xml:lang="en-US"> 
     <seg>Address</seg> 
     </tuv> 
     <tuv xml:lang="de-DE"> 
     <seg>Adresse</seg> 
     </tuv> 
    </tu> 
    ..... 
    </body> 
    </tmx> 

То, что я хочу, чтобы иметь возможность найти все единицы перевода (TU), которые имеют конкретный источник перевод и конкретный целевой перевод. Так, например, я хочу найти все единицы перевода, где значение атрибута языка xml является «en-US», а значение элемента seg - «источник выборки», а значение атрибута языка xml - «de-DE», а его значение элемента seg «образец перевода». Я хочу найти

<tu tuid="18"> 
     <tuv xml:lang="en-AU"> 
     <seg>sample source</seg> 
     </tuv> 
     <tuv xml:lang="de-DE"> 
     <seg>sample translation</seg> 
     </tuv> 
</tu> 

Вполне возможно, а есть более чем один ЕП (та), что соответствует критериям - то есть, возможно, дублирует в памяти переводов.

Я попытался получить коллекцию, которую я мог бы перебирать, например.

XElement root = XElement.Load(@"sample.tmx"); 
     IEnumerable<XElement> translationUnits = 
     from el in root.Elements("tu") 
     where 
      (from tuv in el.Elements("tuv") 
       where 
        (string)tuv.Attribute(XNamespace.Xml + "lang") == "en-US" && 
        (string)tuv.Element("seg") == "sample source" 
       select tuv) 
      .Any() 
     select el; 
       foreach (XElement el in translationUnits) 
        Console.WriteLine((string)el.Attribute("tuid")); 

Однако я, очевидно, делаю что-то неправильно, но я думаю, что я на правильном пути. Как только я нахожу коллекцию, я хочу обновить целевой перевод.

ответ

0

Так я в конце концов решил это для будущей ссылки использует XmlDocument

XmlDocument document = new XmlDocument(); 
document.Load(this.fileName); 
string nodeSelect = "/tmx/body/tu/tuv[lang('" + this.sourceLanguage + "') and seg = '" + this.originalSourceText + "']";    
XmlNodeList nodes = document.DocumentElement.SelectNodes(nodeSelect); 
foreach (XmlNode node in nodes) { 
    XmlNode parent = node.ParentNode; 
    foreach (XmlNode translationNode in parent) { 
    string searchNode = "*[lang('" + this.targetLanguage + "') and //seg = '" + this.originalTranslationText + "']"; 
    XmlNode test = translationNode.SelectSingleNode(searchNode); 
    if (test != null) { 
      if (test.InnerText.Equals(this.originalTranslationText, StringComparison.Ordinal)) { 
       test.InnerText = this.newTranslation; 
      } 
    } 
    } 
} 
Смежные вопросы