我有一个翻译记忆库,它本质上是一个基于翻译记忆库交换格式规范的XML文件,我正在尝试找到一个特定的翻译单元进行编辑。这是结构的一个例子:
<?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语言属性值为&#34; en-US&#34;的所有翻译单元。并且seg元素值是&#34;样本源&#34;并且xml语言属性值为&#34; de-DE&#34;并且它的seg元素值是&#34;样本翻译&#34;。我想找到
<tu tuid="18">
<tuv xml:lang="en-AU">
<seg>sample source</seg>
</tuv>
<tuv xml:lang="de-DE">
<seg>sample translation</seg>
</tuv>
</tu>
也有可能有多个符合标准的翻译单元(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 :(得分: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;
}
}
}
}