【问题标题】:Talend tExtractXMLFieldTalend tExtractXMLField
【发布时间】:2011-02-14 10:56:18
【问题描述】:

我在 Talend 有一份工作,应该检索一个字段并循环遍历它。

我的大问题是代码在 XML 字段中循环,但它返回 null。 这是 XML 的示例:

<?xml version="1.0" encoding="ISO-8859-1"?>
<empresas>
    <empresa>
        <imoveis>
            <imovel>
                [-- some fields --  ]

                <fotos>
                    <nome id="" order="">photo1</nome>
                    <nome id="" order=""></nome>
                    <nome id="" order=""></nome>
                    <nome id="" order=""></nome>
                </fotos>
            </imovel>
            [ -- other entries here -- ]
        </imoveis>
    </empresa>
</empresas>

现在我正在使用 tExtractXMLField 组件来获取“fotos”元素。 这是我在组件中的内容:

我尝试更改 XPath 查询和 XPath 循环查询,但结果要么我没有循环通过该字段,要么我在 tMap 的 value 字段中得到了 null。

这是工作的图片:

您可以看到我已经从 XML 中检索了 4 个项目,但在“nome”字段中我得到的是 null。 XPath 一定有问题,但我似乎找不到问题:(

希望有人可以帮助我。谢谢 注意:我在 ubuntu 10.10 64bit 上使用 talendv4.1.2

【问题讨论】:

    标签: java xml xpath talend


    【解决方案1】:

    如果您想在 &lt;nome&gt; 节点上循环,您的 Loop XPath 查询必须是

    "/empresas/empresa/imoveis/imovel/fotos/nome"
    

    和 foto_nome XPath 查询类似

    "text()"
    

    请注意:我还纠正了您的 XML 中可能带来问题的错误(&lt;/imoveis&gt; 缺少“s”)。

    【讨论】:

      【解决方案2】:

      有两种方法可以解决。一种方法是直接使用 XMLinput 和 bluish 提到的说明。

      另一种方法是继续您选择的路径。在 XMLinput 中,确保您的 Loop XPath 查询设置为 "/empresas/empresa/imoveis/imovel/fotos",并且您通过 fotos 元素并选中了 Get Nodes 选项。 fotos 元素的 XPath 查询应该是 "../fotos""."

      您的 extractXMLField 组件看起来配置良好。 另外,我不知道 tSetGlobalVar 在您的设计中做了什么,但请确保它不会影响您尝试通过的 fotos 元素。

      【讨论】:

        【解决方案3】:


        我做了一个测试工作,这肯定会帮助你。如果我没记错的话,你想获得“fotos”标签下的所有“nome”。

        【讨论】:

          【解决方案4】:

          尝试将循环 xpath 更改为文件“empresas”的顶层。有时这对我有用,我也似乎“?xml版本=“1.0”编码=“ISO-8859-1”?标签之前会导致问题,您可以尝试将其删除。

          还要确保在 tFileInputXML 中正确设置了编码。

          【讨论】:

            【解决方案5】:

            我认为您对阅读 XML 和从 XML 中提取 XML 感到困惑。

            读取 XML: 如果您提供的 XML 部分是您读取的文件 tFileInputXML,则不需要 tExtractXMLField,只需将 tFileInputXML 配置为:

            • 将 xpath 循环设置为 &lt;nome&gt; 元素,例如“//nome”
            • 在 tFileInputXML 组件 id、顺序和内容中添加 3 列
            • 使用 xpath 查询“.”获取内容列
            • 使用 xpath 查询“@id”获取 id 值
            • 使用 xpath 查询“@order”获取订单值

            从 XML 中提取 XML: 这就是 tExtractXMLField 组件的目标: 它允许解析包含在数据库列或另一个 XML 文档中的 XML 数据,就好像它本身就是一个数据流一样。

            简而言之,tExtractXMLField 从包含 XML 的列记录创建数据流。 在解析soap查询结果时非常有用:服务器回复通常以xml形式提供,像这样:

            <arg2> 
              <![CDATA[
                <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
                <exportInscriptionEnLigneType>
                  <date>2015-04-10</date>
                  <nbDossiers>2</nbDossiers>
                  <reference>20150410100</reference>
                  <listeDossiers>
                    <dossier>
                      <numOrdre>1</numOrdre>
                      <identifiantDossier>AAAAA</identifiantDossier>
                    </dossier>
                    <dossier>
                      <numOrdre>2</numOrdre>
                      <identifiantDossier>BBBBB</identifiantDossier>
                    </dossier>
                  </listeDossiers>
                </exportInscriptionEnLigneType>
            ]]>
            </arg2> 
            

            在上面的 XML 中,arg2>元素包含一个您可能需要解析的 XML 文档。

            tExtractXMLField 已为此目的而创建。 我已经写了一篇关于如何完成这项工作的教程,请看这里“how to extract xml from xml”。它是法语的,但屏幕截图可能有助于理解所提供的少数 cmets。

            希望它会有所帮助。

            最好的问候,

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多