GetChildNodes
内容
[
隐藏
]CompositeNode.GetChildNodes method
返回与指定类型匹配的子节点的实时集合。
public NodeCollection GetChildNodes(NodeType nodeType, bool isDeep)
范围 | 类型 | 描述 |
---|---|---|
nodeType | NodeType | 指定要选择的节点类型。 |
isDeep | Boolean | 真的 递归地从所有子节点中选择; 错误的 仅在直系子代中进行选择。 |
返回值
指定类型的子节点的实时集合。
评论
此方法返回的节点集合始终是活动的。
实时收藏始终与文档同步。例如,如果 you 选择文档中的所有部分,并通过集合枚举 删除这些部分,则当从文档中删除该部分时,该部分会立即从集合中删除 。
例子
演示如何打印文档的所有注释及其回复。
Document doc = new Document(MyDir + "Comments.docx");
NodeCollection comments = doc.GetChildNodes(NodeType.Comment, true);
// 如果评论没有祖先,则它是“顶级”评论,而不是回复类型评论。
// 打印所有顶级评论以及他们可能有的任何回复。
foreach (Comment comment in comments.OfType<Comment>().Where(c => c.Ancestor == null))
{
Console.WriteLine("Top-level comment:");
Console.WriteLine($"\t\"{comment.GetText().Trim()}\", by {comment.Author}");
Console.WriteLine($"Has {comment.Replies.Count} replies");
foreach (Comment commentReply in comment.Replies)
{
Console.WriteLine($"\t\"{commentReply.GetText().Trim()}\", by {commentReply.Author}");
}
Console.WriteLine();
}
演示如何从文档中提取图像,并将它们作为单独的文件保存到本地文件系统。
Document doc = new Document(MyDir + "Images.docx");
// 从文档中获取形状集合,
// 并将每个形状的图像数据以图像的形式保存到本地文件系统。
NodeCollection shapes = doc.GetChildNodes(NodeType.Shape, true);
Assert.AreEqual(9, shapes.Count(s => ((Shape)s).HasImage));
int imageIndex = 0;
foreach (Shape shape in shapes.OfType<Shape>())
{
if (shape.HasImage)
{
// 形状的图像数据可能包含多种可能的图像格式的图像。
// 我们可以根据每个图像的格式自动确定其文件扩展名。
string imageFileName =
$"File.ExtractImages.{imageIndex}{FileFormatUtil.ImageTypeToExtension(shape.ImageData.ImageType)}";
shape.ImageData.Save(ArtifactsDir + imageFileName);
imageIndex++;
}
}
演示如何遍历复合节点的子节点集合。
Document doc = new Document();
// 将两个运行和一个形状作为子节点添加到本文档的第一段。
Paragraph paragraph = (Paragraph)doc.GetChild(NodeType.Paragraph, 0, true);
paragraph.AppendChild(new Run(doc, "Hello world! "));
Shape shape = new Shape(doc, ShapeType.Rectangle);
shape.Width = 200;
shape.Height = 200;
// 请注意,“CustomNodeId”不会保存到输出文件中,并且仅在节点生命周期内存在。
shape.CustomNodeId = 100;
shape.WrapType = WrapType.Inline;
paragraph.AppendChild(shape);
paragraph.AppendChild(new Run(doc, "Hello again!"));
// 遍历该段落的直接子级集合,
// 并打印我们在其中找到的任何运行或形状。
NodeCollection children = paragraph.GetChildNodes(NodeType.Any, false);
Assert.AreEqual(3, paragraph.GetChildNodes(NodeType.Any, false).Count);
foreach (Node child in children)
switch (child.NodeType)
{
case NodeType.Run:
Console.WriteLine("Run contents:");
Console.WriteLine($"\t\"{child.GetText().Trim()}\"");
break;
case NodeType.Shape:
Shape childShape = (Shape)child;
Console.WriteLine("Shape:");
Console.WriteLine($"\t{childShape.ShapeType}, {childShape.Width}x{childShape.Height}");
break;
}
演示如何在 CompositeNode 的子节点集合中添加、更新和删除子节点。
Document doc = new Document();
// 默认情况下,一个空文档只有一个段落。
Assert.AreEqual(1, doc.FirstSection.Body.Paragraphs.Count);
// 复合节点(例如我们的段落)可以包含其他复合节点和内联节点作为子节点。
Paragraph paragraph = doc.FirstSection.Body.FirstParagraph;
Run paragraphText = new Run(doc, "Initial text. ");
paragraph.AppendChild(paragraphText);
// 再创建三个运行节点。
Run run1 = new Run(doc, "Run 1. ");
Run run2 = new Run(doc, "Run 2. ");
Run run3 = new Run(doc, "Run 3. ");
// 文档主体不会显示这些运行,直到我们将它们插入到复合节点中
// 它本身是文档节点树的一部分,就像我们在第一次运行时所做的那样。
// 我们可以确定我们插入的节点的文本内容在哪里
// 通过指定相对于段落中另一个节点的插入位置来出现在文档中。
Assert.AreEqual("Initial text.", paragraph.GetText().Trim());
// 将第二个运行插入到第一个运行前面的段落中。
paragraph.InsertBefore(run2, paragraphText);
Assert.AreEqual("Run 2. Initial text.", paragraph.GetText().Trim());
// 在初始运行之后插入第三次运行。
paragraph.InsertAfter(run3, paragraphText);
Assert.AreEqual("Run 2. Initial text. Run 3.", paragraph.GetText().Trim());
// 将第一行插入到段落子节点集合的开头。
paragraph.PrependChild(run1);
Assert.AreEqual("Run 1. Run 2. Initial text. Run 3.", paragraph.GetText().Trim());
Assert.AreEqual(4, paragraph.GetChildNodes(NodeType.Any, true).Count);
// 我们可以通过编辑和删除现有的子节点来修改运行的内容。
((Run)paragraph.GetChildNodes(NodeType.Run, true)[1]).Text = "Updated run 2. ";
paragraph.GetChildNodes(NodeType.Run, true).Remove(paragraphText);
Assert.AreEqual("Run 1. Updated run 2. Run 3.", paragraph.GetText().Trim());
Assert.AreEqual(3, paragraph.GetChildNodes(NodeType.Any, true).Count);
也可以看看
- class NodeCollection
- enum NodeType
- class CompositeNode
- 命名空间 Aspose.Words
- 部件 Aspose.Words