匹配XML Req和Res

时间:2014-06-03 12:20:21

标签: python python-2.6

我需要以下建议

以下是请求和响应XML。请求XML包含要在Foriegn语言中翻译的单词[Texts节点内的String属性],响应XML包含这些单词在英语[inside]中的翻译。

请求XML

    <TranslateArrayRequest>
          <AppId /> 
    <From>ru</From> 
    <Options> 
            <Category xmlns="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2" ></Category> 
            <ContentType xmlns="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2">text/plain</ContentType> 
            <ReservedFlags xmlns="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2" /> 
            <State xmlns="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2" ></State> 
            <Uri xmlns="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2" ></Uri> 
             <User xmlns="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2" ></User> 
        </Options> 
        <Texts> 
        <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">вк азиза и ринат</string> 
        <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">скачать кайда кайдк кайрат нуртас бесплатно</string>
   </Texts> 
    <To>en</To> 
</TranslateArrayRequest>

RESPONSE XML

    <ArrayOfTranslateArrayResponse xmlns="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <TranslateArrayResponse>
            <From>ru</From>
            <OriginalTextSentenceLengths xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"><a:int>16</a:int>
            </OriginalTextSentenceLengths>
            <State/>
            <TranslatedText>BK Aziza and Rinat</TranslatedText>
            <TranslatedTextSentenceLengths xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"><a:int>18</a:int>
            </TranslatedTextSentenceLengths>
        </TranslateArrayResponse>
        <TranslateArrayResponse>
            <From>ru</From>
            <OriginalTextSentenceLengths xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"><a:int>43</a:int>  </OriginalTextSentenceLengths>
            <State/>
            <TranslatedText>Kairat kajdk Qaeda nurtas download free</TranslatedText>
            <TranslatedTextSentenceLengths xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"><a:int>39</a:int></TranslatedTextSentenceLengths>
        </TranslateArrayResponse
</ArrayOfTranslateArrayResponse>

1 个答案:

答案 0 :(得分:0)

因此,有两种方法可以将翻译后的文本与原始文本相关联:

  1. 原文的长度;和
  2. XML文件中的订单
  3. 长度相关可能是不可靠的,因为翻译具有相同字符数的2个或更多个短语的概率相对较大。

    所以归结为订单。我认为假设文件是​​以相同的顺序处理和编写是相对安全的。因此,我将向您展示一种使用XML文件顺序关联短语的方法。


    这个比较简单。我们只是遍历树并抓住列表中的单词。此外,对于由于其结构而翻译的XML,我们需要获取根的命名空间:

    import re
    import xml.etree.ElementTree as ElementTree
    
    def map_translations(origin_file, translate_file):
        origin_tree = ElementTree.parse(origin_file)
        origin_root = origin_tree.getroot()
    
        origin_text = [string.text for text_elem in origin_root.iter('Texts')
                       for string in text_elem]
    
        translate_tree = ElementTree.parse(translate_file)
        translate_root = translate_tree.getroot()
    
        namespace = re.match('{.*}', translate_root.tag).group()
    
    
        translate_text = [text.text for text in translate_root.findall(
                              './/{}TranslatedText'.format(namespace))]
    
        return dict(zip(origin_text, translate_text))
    
    
    origin_file = 'some_file_path.xml'
    translate_file = 'some_other_path.xml'
    
    mapping = map_translations(origin_file, translate_file)
    
    print(mapping)
    

    更新

    以上代码适用于Python 2.7+。在Python 2.6中,它略有改变:

    • ElementTree个对象没有iter个功能。相反,他们有一个getiterator功能。

      将上面的相应行更改为:

      origin_text = [string.text for text_elem in origin_root.iter('Texts')
                     for string in text_elem]
      
    • XPath语法(最有可能)不受支持。为了进入TranslatedText节点,我们需要使用与上述相同的策略:

      将上面的相应行更改为:

      translate_text = [string.text for text in translate_root.getiterator(
                            '{0}TranslateArrayResponse'.format(namespace))
                            for string in text.getiterator(
                            '{0}TranslatedText'.format(namespace))]