Чтение / редактирование XLIFF с использованием C # - PullRequest
2 голосов
/ 29 марта 2011

Мне нужно проанализировать файл XLIFF с помощью C #, но у меня возникли некоторые проблемы. Эти файлы довольно сложны, содержат огромное количество узлов.

По сути, все, что мне нужно сделать, это прочитать узел source с каждого узла trans-unit , выполнить на нем некоторую обработку и вставить обработанный текст в соответствующий target узел (который всегда будет присутствовать, но пустой).

Пример одного из узлов, которые мне нужно проанализировать, будет (весь файл может содержать 100 из них):

<trans-unit id="0000000002" datatype="text" restype="string">
<source>Windows Update is not installed</source>
<target/>
<iws:segment-metadata tm_score="0.00" ws_word_count="6" max_segment_length="0">
<iws:status target_content="placeholders_only"/>
</iws:segment-metadata>
<iws:boundary-seg sequence="bs20721"/>
<iws:markup-seg sequence="0000000001">
</trans-unit>

Узлы trans-unit могут быть закопаны глубоко в файлах, раздел заголовка содержит много данных. Я бы хотел использовать LINQ to XML для чтения данных, но мне не повезло заставить их работать. Вот мой текущий код (просто пытаюсь прочитать и вывести исходные узлы из файла:

        XDocument doc = XDocument.Load(path);

        Console.WriteLine("Before loop");

        foreach (var transUnitNode in doc.Descendants("trans-unit"))
        {
            Console.WriteLine("In loop");
            XElement sourceNode = transUnitNode.Element("source");
            XElement targetNode = transUnitNode.Element("target");
            Console.WriteLine("Source: " + sourceNode.Value);
        }

Я никогда не вижу «В цикле» и не знаю почему, кто-то может сказать мне, что я здесь делаю неправильно, или предложить лучший способ добиться того, что я пытаюсь сделать здесь?

Спасибо.

1 Ответ

2 голосов
/ 29 марта 2011

Попробуйте

XNamespace df = doc.Root.Name.Namespace;
foreach (XElement transUnitNode in doc.Descendants(df + "trans-unit"))
{
  XElement sourceNode = transUnitNode.Element(df + "source");
  // and so one, use the df namespace object to qualify any elements names
}

См. Также http://msdn.microsoft.com/en-us/library/bb387093.aspx.

...