Java如何遍历MC所有ITEM

本文介绍如何使用特定命令遍历Memcached (MC) 中的所有项(ITEM)。通过telnet连接到MC服务器并执行statsitems, statscachedump 和 get命令,可以遍历所有项,并查看键值对。使用Java实现的方法将在后续内容中提供。
<!-- [if gte mso 10]> <mce:style><!-- /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} table.MsoTableGrid {mso-style-name:网格型; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; border:solid windowtext 1.0pt; mso-border-alt:solid windowtext .5pt; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-border-insideh:.5pt solid windowtext; mso-border-insidev:.5pt solid windowtext; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.0pt; font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} --><!-- [endif]-->

Java 如何遍历 MC 所有 ITEM

1mc 遍历 item 原理

Mc 遍历 item 用到的命令有三个: stats itemsstats cachedump, get 。通过 telnet 程序 telnetmc 服务器上( telnet ip 地址 端口号,如 telnet 192.168.0.1 11211 ),依次执行上述 3 个命令即可遍历 mcitem 对象,及查看 key 对应的 value 值。

1) stats items :显示各个 slabitem 的数目和最老 item 的年龄 ( 最后一次访问距离现在的秒数 )

stats items

STAT items:1:number 2

STAT items:1:age 847

STAT items:4:number 1

STAT items:4:age 831

STAT items:10:number 1

STAT items:10:age 830

END

2stats cachedump

stats cachedump slab_id limit_num ,显示某个 slab 中的前 limit_numkey 列表,显示格式如下:

ITEM key_name [ value_length b; expire_time|access_time s]

其中, memcached 1.2.2 及以前版本显示的是访问时间 (timestamp)1.2.4 以上版本,包括 1.2.4 显示 过期时间 (timestamp) ,如果是永不过期的 keyexpire_time 会显示为服务器启动的时间。

下述脚本为现实上述 item 1 下的所有 key 值,如 2248.516289644596

stats cachedump 1 0

ITEM 2248.516289644596 [4 b; 1257986909 s]

ITEM 3626.4522262678565 [4 b; 1257986895 s]

END

至此,只要循环 1 )列出的 items2 )下的具体每个 item 对应的所有 key ,即可遍历 mc 中存放的所有对象的 key 值,那么,只要 getkey 值,即可获取 key 对应的 value 值。

2java 代码实现,待续

要**获取 Word 文档中的所有 XML 标签(包括 `<w:sdt>`、`<w:p>`、`<w:r>`、`<w:t>` 等)**,你必须绕过 Apache POI 的高层封装(如 `XWPFParagraph`、`XWPFRun`),直接访问底层的 OpenXML 结构。因为 POI 的设计目标是提供语义化操作,而不是暴露原始 XML 所有节点。 --- ### 回答: #### ✅ 你可以通过以下方式 **完整提取 `.docx` 文件中所有的 XML 标签结构**,包括 `<sdt>`、`<p>`、`<tbl>` 等所有标签: ### 方法:解压 `.docx` 并解析 `document.xml` `.docx` 实际上是一个 ZIP 压缩包,包含多个 XML 文件。文档正文内容位于: ``` word/document.xml ``` 我们要做的是: 1. 解压 `.docx` 2. 读取 `word/document.xml` 3. 使用 `XmlBeans` 或 `DOM/SAX` 解析器遍历所有节点 --- ### ✅ 推荐 Java 代码:使用 DOM 解析器读取 `document.xml` 中的所有标签名 ```java import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import java.io.File; import java.io.FileInputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; public class GetAllXmlTags { public static void printAllTags(File docxFile) throws Exception { try (ZipInputStream zis = new ZipInputStream(new FileInputStream(docxFile))) { ZipEntry entry; while ((entry = zis.getNextEntry()) != null) { if ("word/document.xml".equals(entry.getName())) { // 解析 document.xml DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); // 启用命名空间支持 DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(zis); // 遍历所有元素节点 traverseNode(doc.getDocumentElement(), 0); break; } zis.closeEntry(); } } } private static void traverseNode(Node node, int level) { if (node.getNodeType() == Node.ELEMENT_NODE) { String tagName = node.getLocalName(); // 忽略命名空间前缀 String namespacePrefix = node.getPrefix(); // 如 w, mc, sdt System.out.println("-".repeat(level) + " [" + Optional.ofNullable(namespacePrefix).orElse("")]:" + tagName); // 输出属性(可选) NodeList attrs = node.getAttributes(); for (int i = 0; attrs != null && i < attrs.getLength(); i++) { Node attr = attrs.item(i); System.out.println(" ".repeat(level + 1) + "@" + attr.getNodeName() + "=" + attr.getNodeValue()); } } NodeList children = node.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { traverseNode(children.item(i), level + 1); } } // 使用示例 public static void main(String[] args) throws Exception { File docx = new File("template.docx"); printAllTags(docx); } } ``` --- ### 输出示例(部分): ``` [w]:document --[w]:body ----[w]:p ------[w]:r --------[w]:t ---------- 文本内容 ----[sdt]:sdt ------[sdt]:sdtContent --------[w]:p ----------[w]:r ------------[w]:t -------------- 这是一个内容控件 ----[w]:tbl ------[w]:tr --------[w]:tc ----------[w]:p ------------[w]:r ``` 这说明你已经成功获取了: - 所有标签名称(含命名空间) - 层级结构 - 包括 `<sdt>`、`<w:sdt>`、内嵌文本等 --- ### 补充说明: | 方式 | 是否能获取所有标签 | 说明 | |------|------------------|------| | `xwpfDocument.getBodyElements()` | ❌ 否 | 只返回高层块元素(段落、表格),忽略 inline SDT | | `CTBody.getSdtList()` | ❌ 不完整 | 仅 block-level SDT,不包括段落内的 | | `XWPFParagraph.getRuns()` + CTR | ⚠️ 部分 | 可以拿到 run 层级,但仍受限于 POI 封装 | | **直接解析 `document.xml`** | ✅ 完全可以 | 获取每一个 XML 节点,最彻底 | --- ### 注意事项: 1. **命名空间处理**:Word 使用多个命名空间: - `w:` → http://schemas.openxmlformats.org/wordprocessingml/2006/main - `mc:` → http://schemas.openxmlformats.org/markup-compatibility/2006 - `sdt:` 或 `w14:` → 内容控件相关 - 使用 `getLocalName()` 获取无前缀名字,`getPrefix()` 获取前缀 2. **性能与内存**:大文档需考虑流式解析(SAX 或 StAX),避免 OOM。 3. **修改后再打包**:如果想改完 XML 再生成 `.docx`,需要重新压缩其他文件(如 `[Content_Types].xml`, `_rels`, `theme/`, `fontTable.xml` 等) --- ### 总结: 如果你想 **真正“看到”Word 文档里的每一个 XML 标签(包括 `<sdt>`)**,唯一可靠的方法是: > 🔹 **直接读取并解析 `word/document.xml` 文件内容** Apache POI 是高级 API,屏蔽了细节;而你要看细节,就必须深入到底层 XML。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值