【n8n教程】:XML节点,JSON与XML数据随意互转!

本教程将手把手教你如何使用n8n的XML节点进行数据格式转换。无论是处理网站地图、对接遗留系统,还是为AI大模型准备结构化数据,这个教程都能让你快速上手。


📚 什么是XML节点?

XML节点是n8n中的一个核心数据处理工具,用于在JSON和XML两种常见的数据格式之间进行无缝转换。在现实工作中,你可能需要:

XML节点就是解决这些场景的利器。


🎯 XML节点的两大核心功能

功能一:JSON转XML

将结构化的JSON数据转换为标准的XML格式。这对于与只支持XML的老系统集成特别有用。

常用配置项:

参数说明默认值
Root Name设置XML的根元素名称-
Headless是否省略XML声明头(<?xml version=...?>关闭
Cdata对文本节点使用CDATA包装,而不是转义特殊字符关闭
Allow Surrogate Chars是否允许Unicode替代字符关闭

功能二:XML转JSON

从XML文件或数据中提取有用的信息,转换为易于处理的JSON格式。这是处理网站地图、API响应的常用方法。

常用配置项:

参数说明示例
Explicit Array始终将子节点放入数组(开启),或仅多个子节点时才使用数组(关闭)关闭为更紧凑的结构
Explicit Root是否在结果中保留根节点通常关闭
Ignore Attributes忽略所有XML属性,仅创建文本节点关闭以保留属性
Merge Attributes是否将属性与子元素合并为父级属性开启
Normalize Tags是否将所有标签名转换为小写开启
Trim是否移除文本节点的首尾空格开启

🔧 必知的基础配置

所有模式都支持的两个重要参数:

  1. 1. Attribute Key(属性键前缀):
    • • 默认值:$
    • • 用途:指定XML属性在JSON中的前缀
    • • 例如:XML中的 <tag attr="value"> 会变成 {"$attr": "value", "_": "内容"}
  2. 2. Character Key(字符键前缀):
    • • 默认值:_
    • • 用途:指定文本内容在JSON中的键
    • • 例如:XML标签的文本内容会存储在 "_" 键下

📖 实战操作流程

场景一:网站地图转JSON(入门必学)

这是XML节点最常见的应用场景——将网站地图转换为JSON,用于SEO分析或URL爬取。

第一步:添加HTTP请求节点

在n8n工作流中:

  1. 1. 点击"Add first step"
  2. 2. 搜索"HTTP Request"节点
  3. 3. 配置:
    • Method: GET
    • URL: https://example.com/sitemap.xml
    • Authentication: None(除非网站需要认证)

运行节点后,你会获得原始的XML数据。

第二步:添加XML节点进行转换

  1. 1. 点击HTTP节点下的"Add node"按钮
  2. 2. 搜索并选择"XML"节点
  3. 3. 配置参数:
    • Mode: 选择 XML to JSON
    • Property Name: 输入 body(因为HTTP请求返回的XML在body字段中)
    • Explicit Array: 关闭(除非你希望单个元素也显示为数组)
    • Normalize Tags: 开启(保持标签一致性)
    • Trim: 开启(去除多余空格)

配置完成后,XML将自动转换为结构化的JSON对象。

第三步:提取URL列表

网站地图通常有这样的结构:


    
    
    
  <?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">

  <url>

    <loc>
https://example.com/page1</loc>
    <lastmod>
2024-01-15</lastmod>
  </url>

  <url>

    <loc>
https://example.com/page2</loc>
    <lastmod>
2024-01-20</lastmod>
  </url>

</urlset>

转换后的JSON将是:


    
    
    
  {
  "urlset"
: {
    "url"
: [
      {

        "loc"
: "https://example.com/page1",
        "lastmod"
: "2024-01-15"
      }
,
      {

        "loc"
: "https://example.com/page2",
        "lastmod"
: "2024-01-20"
      }

    ]

  }

}

添加一个Split Out节点来分离每个URL元素,便于进一步处理。


场景二:JSON转XML格式化LLM指令

很多开发者发现,为AI大模型提供XML格式的结构化指令效果更好。这就是JSON转XML的应用场景。

第一步:准备JSON数据

使用"Set"节点创建你的数据:


    
    
    
  {
  "agent"
: {
    "name"
: "ContentAnalyzer",
    "description"
: "分析并总结文章内容",
    "instructions"
: "请提取标题、摘要和关键词"
  }
,
  "input_format"
: "markdown",
  "output_format"
: "json"
}

第二步:添加XML节点转换

  1. 1. 添加"XML"节点
  2. 2. 配置:
    • Mode: 选择 JSON to XML
    • Property Name: 输入要转换的属性名(如 body
    • Root Name: 输入 agent_config(作为XML的根元素)
    • Headless: 关闭(包含XML声明)
    • Cdata: 开启(避免特殊字符转义问题)

第三步:获得XML输出

转换后的XML将是:


    
    
    
  <?xml version="1.0"?>
<agent_config>

  <agent>

    <name>
ContentAnalyzer</name>
    <description>
分析并总结文章内容</description>
    <instructions>
请提取标题、摘要和关键词</instructions>
  </agent>

  <input_format>
markdown</input_format>
  <output_format>
json</output_format>
</agent_config>

此XML格式的结构化指令可以直接传递给OpenAI、Claude等LLM API。


场景三:属性和文本内容的完整处理

当XML包含属性(attributes)时,如何正确处理?

原始XML示例:


    
    
    
  <document version="1.0" language="zh">
  <title author="张三">
教程标题</title>
  <content>
教程内容</content>
</document>

配置XML节点(XML to JSON):

得到的JSON:


    
    
    
  {
  "document"
: {
    "$version"
: "1.0",
    "$language"
: "zh",
    "title"
: {
      "$author"
: "张三",
      "_"
: "教程标题"
    }
,
    "content"
: "教程内容"
  }

}

⚙️ 常见陷阱与解决方案

问题原因解决方案
错误:"Item has no JSON property"XML数据在错误的属性字段中检查"Property Name"配置是否匹配数据源
转换后的JSON单层结构未配置"Explicit Array"根据需求开启或关闭此选项
特殊字符显示乱码未使用CDATA包装JSON转XML时开启"Cdata"选项
性能变慢处理过大的XML文件使用Split节点分批处理,或在HTTP层面添加分页
属性没有被识别"Ignore Attributes"被开启了关闭此选项以保留XML属性

💡 专业提示

  1. 1. 总是验证转换结果:在传递给下一个节点前,使用"Execute step"运行节点并检查OUTPUT面板
  2. 2. 处理大型XML:对于超过1MB的XML文件,先用"Extract from File"节点将其从二进制文件中提取出来
  3. 3. 重用配置:将常用的XML转换配置保存为工作流模板,加快后续工作
  4. 4. 监控错误:设置Error Handling选项,防止单个转换失败导致整个工作流中断

🚀 完整工作流案例:自动化网站地图分析

这个工作流自动获取网站地图、解析所有URL,并检查特定页面是否更新。

工作流代码(JSON格式):


    
    
    
  {
  "meta"
: {
    "instanceId"
: "workflow-sitemap-analysis",
    "templateCredsSetupCompleted"
: false
  }
,
  "name"
: "Sitemap XML to JSON Analysis",
  "nodes"
: [
    {

      "parameters"
: {
        "rule"
: {
          "interval"
: [
            {

              "triggerAtHour"
: 9
            }

          ]

        }

      }
,
      "type"
: "n8n-nodes-base.scheduleTrigger",
      "typeVersion"
: 1.2,
      "position"
: [
        -600
,
        -200

      ]
,
      "id"
: "schedule_trigger",
      "name"
: "Daily Schedule at 9 AM"
    }
,
    {

      "parameters"
: {
        "method"
: "GET",
        "url"
: "{{ $env.SITEMAP_URL || 'https://example.com/sitemap.xml' }}",
        "sendHeaders"
: false,
        "responseFormat"
: "text"
      }
,
      "type"
: "n8n-nodes-base.httpRequest",
      "typeVersion"
: 4.2,
      "position"
: [
        -300
,
        -200

      ]
,
      "id"
: "fetch_sitemap",
      "name"
: "Fetch Sitemap"
    }
,
    {

      "parameters"
: {
        "mode"
: "xmlToJson",
        "propertyName"
: "body",
        "options"
: {
          "explicit_root"
: false,
          "normalize_tags"
: true,
          "trim"
: true,
          "merge_attributes"
: true
        }

      }
,
      "type"
: "n8n-nodes-base.xml",
      "typeVersion"
: 1,
      "position"
: [
        50
,
        -200

      ]
,
      "id"
: "xml_converter",
      "name"
: "Convert XML to JSON"
    }
,
    {

      "parameters"
: {
        "fieldToSplitOut"
: "url",
        "appendFields"
: ""
      }
,
      "type"
: "n8n-nodes-base.splitOut",
      "typeVersion"
: 1,
      "position"
: [
        350
,
        -200

      ]
,
      "id"
: "split_urls",
      "name"
: "Split URLs"
    }
,
    {

      "parameters"
: {
        "assignments"
: {
          "assignments"
: [
            {

              "id"
: "url_field",
              "name"
: "page_url",
              "type"
: "string",
              "value"
: "={{ $json.loc }}"
            }
,
            {

              "id"
: "lastmod_field",
              "name"
: "last_modified",
              "type"
: "string",
              "value"
: "={{ $json.lastmod }}"
            }

          ]

        }

      }
,
      "type"
: "n8n-nodes-base.set",
      "typeVersion"
: 3.4,
      "position"
: [
        650
,
        -200

      ]
,
      "id"
: "set_output",
      "name"
: "Format Output"
    }

  ]
,
  "connections"
: {
    "schedule_trigger"
: {
      "main"
: [
        [

          {

            "node"
: "fetch_sitemap",
            "type"
: "main",
            "index"
: 0
          }

        ]

      ]

    }
,
    "fetch_sitemap"
: {
      "main"
: [
        [

          {

            "node"
: "xml_converter",
            "type"
: "main",
            "index"
: 0
          }

        ]

      ]

    }
,
    "xml_converter"
: {
      "main"
: [
        [

          {

            "node"
: "split_urls",
            "type"
: "main",
            "index"
: 0
          }

        ]

      ]

    }
,
    "split_urls"
: {
      "main"
: [
        [

          {

            "node"
: "set_output",
            "type"
: "main",
            "index"
: 0
          }

        ]

      ]

    }

  }

}

工作流说明:

  1. 1. Daily Schedule at 9 AM:每天上午9点自动触发
  2. 2. Fetch Sitemap:使用HTTP GET请求获取网站的sitemap.xml
  3. 3. Convert XML to JSON:将XML转换为JSON格式,便于数据处理
  4. 4. Split URLs:分离每个URL元素,为后续逐个处理做准备
  5. 5. Format Output:提取关键字段(URL和最后修改时间),格式化输出

实际应用:

你可以在最后添加:


📝 导入这个工作流

  1. 1. 在n8n中创建新工作流
  2. 2. 点击右上角"..."菜单
  3. 3. 选择"Import from File"
  4. 4. 将上述JSON代码保存为文件并导入
  5. 5. 配置SITEMAP_URL环境变量或直接修改URL
  6. 6. 保存并激活工作流

总结


引用链接

[1] 官方文档: https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.xml/
[2] n8n系列教程: https://www.undsky.com/blog/?category=n8n%E6%95%99%E7%A8%8B#