使用C#读取/编辑XLIFF

时间:2011-03-29 15:39:41

标签: c#-4.0 linq-to-xml

我需要使用C#解析XLIFF文件,但我遇到了一些麻烦。这些文件相当复杂,包含大量节点。

基本上,我需要做的就是从每个 trans-unit 节点读取 source 节点,对其进行一些处理,然后将处理后的文本插入到相应的目标节点(始终存在,但为空)。

我需要解析的一个节点的示例是(整个文件可能包含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);
        }

我从来没有看到'In loop'并且我不知道为什么,有人可以告诉我这里我做错了什么,或者建议一个更好的方法来实现我在这里想要做的事情?

感谢。

1 个答案:

答案 0 :(得分:2)

尝试

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