Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
XPath的concat()函数怎么拼接多个字符串?_创想鸟

XPath的concat()函数怎么拼接多个字符串?

concat()函数在xpath中用于拼接两个或更多字符串,参数可以是字符串、数字、布尔值或节点,函数会自动将其转换为字符串并连接。其基本语法为concat(string1, string2, …, stringn),例如concat(‘张’, ‘ ‘, ‘三’)返回’张 三’,而concat(‘姓名:’, /user/firstname, /user/lastname, ‘,年龄:’, /user/age, ‘岁’)可从xml中提取并组合数据生成“姓名:李四,年龄:30岁”。该函数常用于构建动态url(如concat(/gallery/@baseurl, /gallery/photo[1]/@id)生成完整图片路径)、格式化输出文本(如将日期和时间组合成可读句子)、生成唯一标识符(如concat(@category, ‘-‘, @itemcode))以及结合固定文本与属性值生成日志信息等场景。与+操作符不同,concat()专用于字符串拼接,而+仅用于数值相加,尝试用+连接字符串会导致类型错误,因此只要涉及字符串连接就必须使用concat()。使用时需注意:当传入节点集时,concat()仅取第一个节点的值,无法拼接多个节点内容(如/items/item返回多个item时只会取第一个),若需拼接所有节点值应使用xpath 2.0以上的string-join()函数;空字符串或缺失节点不会引发错误,但会导致结果中缺少对应部分,必要时应配合string-length()或normalize-space()进行判断;为提升可读性和可维护性,建议将复杂拼接拆分为清晰参数,避免过度嵌套,并添加注释说明各参数来源,从而确保表达式健壮且易于理解。

XPath的concat()函数怎么拼接多个字符串?

concat()

函数在XPath里就是用来把好几个字符串串起来的,它能接受两个或更多的参数,然后把它们一个接一个地连起来形成一个新的字符串。说白了,就是把零散的文本片段粘合在一起。

解决方案

要拼接多个字符串,你只需要把所有你想连接的字符串作为参数,按顺序传给

concat()

函数就行。它的基本形式是

concat(string1, string2, ..., stringN)

。

举个例子,假设我们想把一个用户的名字和姓氏连接起来,中间加上一个空格:

concat('张', ' ', '三')

结果会是

'张 三'

。

这看起来很简单,但它真正强大之处在于,这些参数不仅仅是固定的字符串字面量,它们可以是来自XML/HTML文档中任何节点的字符串值,甚至是数字、布尔值,

concat()

都会聪明地把它们转换成字符串再拼接。

比如,你有一个XML结构:

  李  四  30

如果你想生成一个“姓名:李四,年龄:30岁”这样的字符串,可以这样写XPath:

concat('姓名:', /user/firstName, /user/lastName, ',年龄:', /user/age, '岁')

这里

/user/firstName

和

/user/lastName

会取出它们的文本内容,

/user/age

也会被自动转换成字符串“30”,最终得到“姓名:李四,年龄:30岁”。这种隐式转换让操作变得非常灵活。

concat()

函数在实际应用中常遇到哪些场景?

其实,

concat()

函数在XPath的世界里,用到的地方还真不少,远不止上面那个简单的例子。我觉得它最常见的几个应用场景,可能就是下面这些了:

一个很典型的场景是构建动态的URL或者文件路径。比如,你正在处理一个XML文件,里面有图片的基础路径和每张图片的ID,你想生成完整的图片URL。假设XML是这样:

    

你可以用

concat(/gallery/@baseUrl, /gallery/photo[1]/@id)

来生成

https://example.com/images/001.jpg

。这比在代码里硬编码方便多了,直接在XPath层面就把数据组织好了。

再比如,格式化输出文本以供展示。就像前面提到的姓名拼接,或者你需要把日期、时间、地点等信息组合成一个易读的句子。比如,从

2023-10-26

中提取“事件发生在2023年10月26日下午14点”。

concat('事件发生在', /event/date, '下午', /event/time, '点')

。这让数据从原始结构中提取出来后,就能直接以用户友好的方式呈现。

还有一种情况,是生成唯一的标识符或键。虽然XPath本身不直接创建数据,但在某些数据转换或校验的场景下,你可能需要根据现有字段组合出一个临时的唯一标识来做比较。比如,

concat(@category, '-', @itemCode)

,把商品的类别和编码连起来作为一个临时的唯一键。

有时候,我们还需要结合固定文本和节点属性值。例如,一个按钮的文本是“查看详情”,但它的

data-id

属性包含了要查看的商品ID。你可能想生成一个日志信息:“用户点击了商品ID为XXX的详情按钮”。

concat('用户点击了商品ID为', //button/@data-id, '的详情按钮')

。

这些场景其实都围绕着一个核心:把分散的数据点,通过一种可控的方式,按照我们的意图重新组合成有意义的字符串。这在数据提取、报告生成、甚至一些简单的文本处理中都非常实用。

concat()

函数与字符串连接操作符(如+)有何不同,何时选择使用它?

这确实是个好问题,尤其是对那些习惯了其他编程语言(比如JavaScript里用

+

来连接字符串)的朋友来说,可能会有点疑惑。在XPath里,

concat()

函数和

+

号,它们俩的职责是完全不一样的,可以说八竿子打不着。

说白了,XPath里的

+

号,它就是个数学运算符,专门用来做数字加法的。如果你写

1 + 2

,结果自然是

3

。但如果你尝试用

'hello' + 'world'

,XPath会直接报错,因为它无法把字符串当作数字来相加。它会抱怨类型不匹配,或者干脆返回一个空的结果集,因为这不是它能理解的操作。

而

concat()

函数呢,它就是字符串连接的专属工具。它的唯一目的就是把传入的参数,无论它们原本是什么类型(字符串、数字、布尔值,甚至是节点集),都强制转换成字符串,然后一个接一个地拼起来。所以,

concat('hello', 'world')

才能得到

'helloworld'

。

那么,什么时候选择使用

concat()

呢?答案很简单:只要你的目标是拼接字符串,就无脑选择

concat()

。

如果你想把两个文本内容连接起来,用

concat()

。如果你想把一个数字转换成字符串并与另一个字符串连接,用

concat()

(它会帮你自动转换)。如果你想把一个布尔值(比如

true()

)转换成字符串“true”并连接,用

concat()

。如果你想把一个节点的值取出来并与其他文本连接,也用

concat()

。

永远不要尝试在XPath 1.0中用

+

号来连接字符串,那会是个坑。它不是用来干这个的。

concat()

是XPath标准库里为字符串连接量身定制的函数,用它,准没错。理解这一点,能避免很多初学者常犯的类型错误。

使用

concat()

时,有哪些值得注意的“坑”或最佳实践?

虽然

concat()

用起来直观,但有些细节如果你不注意,可能会踩到一些小“坑”,或者说,有些地方值得我们特别留意,让代码更健壮、更清晰。

一个常见的“坑”就是对参数的隐式类型转换。前面提到了,

concat()

会把所有参数都转成字符串。这通常很方便,但有时候也可能导致意外。比如,如果你不小心传入了一个节点集(Node-set),

concat()

只会取这个节点集中的第一个节点的字符串值来拼接。例如,你有

AB

,然后你写

concat('List: ', /items/item)

。你可能期望得到“List: AB”,但实际结果只会是“List: A”。这是因为

/items/item

这个XPath表达式返回的是一个包含两个


节点的节点集,而

concat()

函数在处理节点集参数时,只取第一个节点的字符串值。如果你真的想拼接所有

item

的值,在XPath 1.0中,

concat()

本身是做不到的,你可能需要外部循环或者更高级的XPath 2.0+函数(比如

string-join

)。所以,在使用节点集作为参数时,要清楚

concat()

的行为。

另一个小点是关于空字符串的处理。如果你传入的某个参数最终评估为空字符串(比如一个节点不存在或者其文本内容为空),

concat()

会直接忽略它,不会报错,也不会在结果中留下任何痕迹。这通常是个期望的行为,但如果你依赖某个部分必须存在才能正确拼接,那就需要额外的判断(比如

normalize-space()

或者

string-length()

)来确保数据的完整性。

至于最佳实践,我觉得有几点可以分享:

保持参数的清晰性:尽量让每个参数代表一个独立的、有意义的文本片段或数据点。避免在一个参数内部做太多的复杂计算,那样会降低可读性。处理可能缺失的数据:如果某些节点或属性可能不存在,导致它们的值为空,而你又不想结果字符串中出现多余的空格或逗号,你可能需要在

concat()

之外,先用

if

语句(在支持的XPath版本中)或者其他逻辑来判断这些值是否存在。或者,如果你只是想避免空值带来的“空隙”,

concat()

本身处理得很好,它不会因为空字符串而多出分隔符。适当的嵌套:虽然

concat()

可以接受任意多的参数,但如果你的拼接逻辑非常复杂,涉及到很多条件判断,你可能需要考虑在XPath表达式中适当的嵌套,或者将复杂的逻辑分解成多个步骤。不过对于简单的多字符串拼接,平铺的

concat()

是最直接的。考虑可维护性:对于非常长的

concat()

表达式,可以考虑将其拆分成多行,或者在注释中说明每个参数的来源和目的,这有助于未来他人(或自己)理解和维护。

总的来说,

concat()

是一个强大而直接的工具,理解它的类型转换规则和节点集处理方式,就能避开大部分的“坑”,并能更高效地利用它来构建你想要的字符串。

以上就是XPath的concat()函数怎么拼接多个字符串?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1430251.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何在Ada中使用XML/Ada库解析航天数据XML?
上一篇 2025年12月17日 03:28:23
XPath的floor()和ceiling()函数有什么区别?
下一篇 2025年12月17日 03:28:27

相关推荐

  • 如何通过Debian Context提高用户粘性

    如何通过Debian Context提高用户粘性如何通过Debian Context提高用户粘性如何通过Debian Context提高用户粘性如何通过Debian Context提高用户粘性

    Debian以其稳定性和安全性而闻名,是广受欢迎的开源操作系统。虽然“Debian Context”并非Debian的正式术语或功能,但我们可以将其理解为Debian生态系统。本文将探讨如何提升Debian用户粘性,增强用户对Debian的忠诚度和参与度。 提升用户体验的关键策略: 一、完善信息支持…

    2026年9月26日 • 用户投稿
    000
  • 利好!TikTokShop欧洲市场入驻标准更新

    利好!TikTokShop欧洲市场入驻标准更新利好!TikTokShop欧洲市场入驻标准更新利好!TikTokShop欧洲市场入驻标准更新利好!TikTokShop欧洲市场入驻标准更新

    近日,tiktokshop跨境电商针对欧洲市场释放利好信号!英国、西班牙、德国、意大利、法国欧洲五国跨境自运营(pop)模式,入驻标准更新及商家扶持新政策迎来官宣。 最新招商政策中,新商的调整核心在于,商家的第三方电商平台运营经验由【必填】调整为【选填】。同时,TikTokShop美区重点商家、有亚…

    2026年9月26日 • 用户投稿
    000
  • sublime怎么在windows下实现免安装绿色版_Windows便携版制作与使用

    sublime怎么在windows下实现免安装绿色版_Windows便携版制作与使用sublime怎么在windows下实现免安装绿色版_Windows便携版制作与使用sublime怎么在windows下实现免安装绿色版_Windows便携版制作与使用sublime怎么在windows下实现免安装绿色版_Windows便携版制作与使用

    制作Sublime Text绿色版只需下载zip包并解压,然后在安装目录内创建“Data”文件夹,启动后所有配置和插件将自动存入该文件夹,实现便携化。 在Windows下制作Sublime Text的免安装绿色版,其实比你想象的要简单直接得多。核心思路就是让Sublime Text把它的所有配置、插…

    2026年9月26日 • 用户投稿
    100
  • VS Code工作台定制:活动栏与面板可见性配置指南

    隐藏活动栏可通过命令面板执行“View: Toggle Activity Bar Visibility”或设置”workbench.activityBar.visible”: false;2. 面板可用Ctrl+J切换显示,通过”workbench.panel.d…

    2026年9月26日
    000
  • Tomcat日志中常见的性能瓶颈是什么

    在tomcat日志中,常见的性能瓶颈主要包括以下几个方面: 线程数配置不当: 问题描述:Tomcat的线程数配置不合理可能导致请求堆积或线程资源浪费。如果线程数过少,可能无法处理高并发请求,导致请求延迟增加。相反,线程数过多可能导致频繁的上下文切换和资源竞争,影响性能。解决方法:根据服务器的硬件资源…

    2026年9月26日
    000
  • 360极速浏览器下载任务中断或失败怎么办_下载失败问题排查与解决方法

    360极速浏览器下载任务中断或失败怎么办_下载失败问题排查与解决方法360极速浏览器下载任务中断或失败怎么办_下载失败问题排查与解决方法360极速浏览器下载任务中断或失败怎么办_下载失败问题排查与解决方法360极速浏览器下载任务中断或失败怎么办_下载失败问题排查与解决方法

    360极速浏览器下载失败可尝试关闭下载加速模块、调整IE安全设置、切换默认下载工具、更新浏览器或使用IDM等第三方工具解决。 如果您在使用360极速浏览器下载文件时,发现下载任务频繁中断或直接失败,可能是由于浏览器设置、网络环境或安全策略限制所致。以下是针对此问题的详细排查与解决方法。 本文运行环境…

    2026年9月26日 • 用户投稿
    200
  • 怎样制作wps文档

    怎样制作wps文档怎样制作wps文档怎样制作wps文档怎样制作wps文档

    首先打开WPS Office,可新建空白文档自由编辑,或选择预设模板快速生成简历、报告等标准文件,也可导入.doc、.docx等格式的外部文件进行修改与保存。 如果您想要创建一份专业的文档,但不确定如何开始,WPS Office 提供了简单直观的方式来帮助您完成。通过其丰富的编辑功能和模板资源,您可…

    2026年9月26日 • 用户投稿
    000
  • windows怎么查看ip地址_Windows查看本地IP地址详细教程

    windows怎么查看ip地址_Windows查看本地IP地址详细教程windows怎么查看ip地址_Windows查看本地IP地址详细教程windows怎么查看ip地址_Windows查看本地IP地址详细教程windows怎么查看ip地址_Windows查看本地IP地址详细教程

    首先通过命令提示符输入ipconfig可查看IP地址,其次在设置应用的网络属性、网络和共享中心详细信息及任务管理器性能选项卡中均可找到IPv4地址。 如果您需要在Windows电脑上查找网络配置信息,但不确定如何获取设备的IP地址,则可以通过多种系统自带的功能来实现。以下是几种常用的查看方法: 本文…

    2026年9月26日 • 用户投稿
    000
  • 雷神 911 主机如何测试 M.2 接口?带宽性能评估​

    雷神 911 主机如何测试 M.2 接口?带宽性能评估​雷神 911 主机如何测试 M.2 接口?带宽性能评估​雷神 911 主机如何测试 M.2 接口?带宽性能评估​雷神 911 主机如何测试 M.2 接口?带宽性能评估​

    要测试雷神 911 主机 m.2 接口的带宽性能,首先确认其支持的协议(pcie 或 sata)及规格,可查阅主板说明书或使用硬件检测工具;准备 m.2 ssd、最新驱动、windows 10/11 系统及测试软件如 crystaldiskmark 和 as ssd benchmark;运行测试并记…

    2026年9月26日 • 用户投稿
    000
  • 抖音任务接单平台微信小程序是什么

    抖音任务接单平台微信小程序是什么抖音任务接单平台微信小程序是什么抖音任务接单平台微信小程序是什么抖音任务接单平台微信小程序是什么

    抖音任务接单平台微信小程序是一款专为抖音内容创作者打造的高效变现工具。 该小程序集成了任务获取、进度管理、收入统计、智能提醒等多项实用功能,帮助用户更便捷地完成商业合作,提升在抖音平台的内容变现能力。 抖音任务接单平台微信小程序的核心功能 任务接单:高效匹配 通过抖音任务接单平台微信小程序,用户可以…

    2026年9月26日 • 用户投稿
    000
  • 货拉拉司机版如何使用AI推荐最佳订单_货拉拉司机版AI推荐的智能匹配详解

    货拉拉司机版如何使用AI推荐最佳订单_货拉拉司机版AI推荐的智能匹配详解货拉拉司机版如何使用AI推荐最佳订单_货拉拉司机版AI推荐的智能匹配详解货拉拉司机版如何使用AI推荐最佳订单_货拉拉司机版AI推荐的智能匹配详解货拉拉司机版如何使用AI推荐最佳订单_货拉拉司机版AI推荐的智能匹配详解

    货拉拉司机版通过AI智能匹配系统,基于位置、车辆类型、货运需求与历史行为等数据筛选高匹配订单,并结合AR识货、智能导航与安全预警功能,提升接单效率与运输安全。 如果您在货拉拉司机版中希望获得更高效的接单体验,但不清楚如何利用系统内的AI功能来获取最适合的订单,则可能是由于尚未了解智能匹配机制的运作方…

    2026年9月26日 • 用户投稿
    200
  • sublime怎么写latex并编译成pdf_Sublime配置LaTeX编译环境指南

    sublime怎么写latex并编译成pdf_Sublime配置LaTeX编译环境指南sublime怎么写latex并编译成pdf_Sublime配置LaTeX编译环境指南sublime怎么写latex并编译成pdf_Sublime配置LaTeX编译环境指南sublime怎么写latex并编译成pdf_Sublime配置LaTeX编译环境指南

    首先安装LaTeX发行版,如Windows选TeX Live,macOS用MacTeX,Linux通过包管理器安装;然后在Sublime Text中通过Package Control安装LaTeXTools插件;接着配置LaTeXTools的用户设置,指定tex_path路径、构建方式和PDF查看器…

    2026年9月26日 • 用户投稿
    000
  • 快手视频如何下载保存_快手视频下载保存的简单方法

    快手视频如何下载保存_快手视频下载保存的简单方法快手视频如何下载保存_快手视频下载保存的简单方法快手视频如何下载保存_快手视频下载保存的简单方法快手视频如何下载保存_快手视频下载保存的简单方法

    优先使用快手App内“保存到相册”功能下载公开视频,操作简单且保留原画质;2. 若视频受限制或需无水印版本,可复制链接后通过第三方解析网站提取下载;3. 通用方法为启用手机录屏功能,录制并保存视频内容至相册。 如果您在浏览快手时看到喜欢的视频,想要将其保存到本地设备以便离线观看或分享,但发现部分视频…

    2026年9月26日 • 用户投稿
    000
  • 视频号视频怎么加文字?加文字怎么跟着视频走?

    视频号视频怎么加文字?加文字怎么跟着视频走?视频号视频怎么加文字?加文字怎么跟着视频走?视频号视频怎么加文字?加文字怎么跟着视频走?视频号视频怎么加文字?加文字怎么跟着视频走?

    视频号已成为内容创作的重要阵地,而文字是提升视频表现力的关键元素。无论是标题、字幕还是特效文字,恰当的文字运用能让你的视频内容更丰富,传播效果更佳,吸引更多观众停留互动。 一、视频号视频怎么加文字? 1.发布时添加标题和描述 在视频号发布页面,最基础的文字就是标题和描述。标题要简洁有力,用15字以内…

    2026年9月26日 • 用户投稿
    200
  • vivo X300系列重构移动影像体验,全链路创新开启场景化创作新时代

    vivo X300系列重构移动影像体验,全链路创新开启场景化创作新时代vivo X300系列重构移动影像体验,全链路创新开启场景化创作新时代vivo X300系列重构移动影像体验,全链路创新开启场景化创作新时代vivo X300系列重构移动影像体验,全链路创新开启场景化创作新时代

    9月26日,vivo在“x系列蓝图影像技术沟通会”上正式发布全新影像战略,提出以“场景解决方案”为核心,构建开放协同的影像生态,推动移动影像从功能性工具向文化表达载体跃迁。作为这一战略的首款实践之作,vivo x300系列通过全链路技术创新,在画质表现、极限拍摄、旅行人像及视频创作四大维度实现全面突…

    2026年9月26日 • 用户投稿
    000
  • 360极速浏览器账号如何登录和退出_360极速浏览器用户账号登录与注销操作

    360极速浏览器账号如何登录和退出_360极速浏览器用户账号登录与注销操作360极速浏览器账号如何登录和退出_360极速浏览器用户账号登录与注销操作360极速浏览器账号如何登录和退出_360极速浏览器用户账号登录与注销操作360极速浏览器账号如何登录和退出_360极速浏览器用户账号登录与注销操作

    登录360极速浏览器需通过左上角头像或右上角菜单进入登录界面,输入账号密码或使用手机号快捷验证完成登录;如需切换账户或保护隐私,可点击头像后选择退出登录,或通过设置菜单清除Cookie等方式彻底注销并重启浏览器。 如果您在使用360极速浏览器时需要同步收藏夹、设置或使用云服务,则必须先登录您的360…

    2026年9月26日 • 用户投稿
    100
  • Debian系统上Tomcat日志如何备份

    Debian系统上Tomcat日志如何备份Debian系统上Tomcat日志如何备份Debian系统上Tomcat日志如何备份Debian系统上Tomcat日志如何备份

    本文介绍几种在Debian系统上备份Tomcat日志文件的有效方法,帮助您安全地保存和管理重要的日志信息。 方法一:手动备份 找到日志文件: Tomcat日志文件通常位于 /var/log/tomcat 或 /opt/tomcat/logs 目录下。请根据您的实际安装路径进行调整。压缩日志: 使用 …

    2026年9月26日 • 用户投稿
    000
  • Linux如何从源码编译安装软件_configure与make命令详解

    Linux如何从源码编译安装软件_configure与make命令详解Linux如何从源码编译安装软件_configure与make命令详解Linux如何从源码编译安装软件_configure与make命令详解Linux如何从源码编译安装软件_configure与make命令详解

    答案是掌握 ./configure 和 make 的作用与用法可完成 Linux 源码编译安装。1. configure 检查系统环境并生成 Makefile,确保编译条件满足,支持 –prefix、–enable、–with 等选项定制安装;2. make 读取…

    2026年9月26日 • 用户投稿
    000
  • ChatGPT是否能用于语言学习 辅助学习语言的实际案例与建议

    ChatGPT是否能用于语言学习 辅助学习语言的实际案例与建议ChatGPT是否能用于语言学习 辅助学习语言的实际案例与建议ChatGPT是否能用于语言学习 辅助学习语言的实际案例与建议ChatGPT是否能用于语言学习 辅助学习语言的实际案例与建议

    本文将详细探讨如何利用ChatGPT作为语言学习的辅助工具。通过具体的实际案例和清晰的步骤指引,我们将演示如何将其融入日常学习,有效进行对话模拟、语法校对、词汇积累和写作优化,从而帮助学习者掌握一种高效的语言辅助学习方法。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 Dee…

    2026年9月26日 • 用户投稿
    000
  • 联想拯救者主机如何检测固态寿命?SMART 数据解读​

    联想拯救者主机如何检测固态寿命?SMART 数据解读​联想拯救者主机如何检测固态寿命?SMART 数据解读​联想拯救者主机如何检测固态寿命?SMART 数据解读​联想拯救者主机如何检测固态寿命?SMART 数据解读​

    固态硬盘寿命检测主要通过读取smart数据实现,具体方法包括:1.使用联想电脑管家查看硬盘健康状态;2.使用crystaldiskinfo等工具获取详细smart信息;3.选择其他第三方检测软件;4.通过命令行或powershell脚本获取更详细的smart数据。解读crystaldiskinfo时…

    2026年9月26日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信