如何通过属性获取某个节点的XML结构及内容

除了使用
document.Save(stream, SaveFormat.FlatOpc);
方法,有无其他属性可以直接获取到节点的XML结构内容?

/// <summary>
/// 将 Aspose.Words.Node 转换为 XDocument
/// </summary>
/// <param name="node">指定需要转换的节点</param>
/// <returns></returns>
public static XDocument ConvertNodeToXmlAsync(this Node node)
{
    // 创建新的 Word 文档
    var newDoc = new Document();
    var importedNode = newDoc.ImportNode(node, true);
    newDoc.FirstSection.Body.AppendChild(importedNode);

    using var stream = new MemoryStream();
    newDoc.Save(stream, Aspose.Words.Saving.SaveOptions.CreateSaveOptions(SaveFormat.FlatOpc));

    // 读取流数据并转换为 XML
    var xmlOutput = Encoding.UTF8.GetString(stream.ToArray());

    return XDocument.Parse(xmlOutput);
}

目前我是通过这种办法间接获取某个节点的XML,但是这样对于大文件很耗费性能,Aspose.Words中有无可以对node的直接通过属性获取其XML内容的。

@yujiuyao

请问您能否提供更多关于您使用的具体节点类型和上下文的信息?

支持任意类型节点的属性,或者段落,表格,形状,或者文本块

@yujiuyao 遗憾的是,目前还没有简单甚至可行的方法将独立节点导出为可读 XML。 例如,如果没有主题和样式,简单的段落就无法存在。 另一个例子是图表节点,它具有外部 XML、DML 及其 ID 等。 我们认为尝试实现这一功能没有意义。

如果您真的有兴趣将单独的节点保存到 FlatOpc,可以通过以下方法实现:

  1. 克隆原始文档。
  2. 删除除感兴趣的节点之外的所有节点。
  3. 保存到 FlatOpc

就像你的方法一样。

1 Like

我其实也不是有兴趣将单独的节点保存到 FlatOpc,只不过我在解析图片的时候遇到这样一个问题:
内嵌样式的图片本身是在Run节点下的,但是Aspose会将图片解析在段落节点下,所以图片所在Run的下划线无法获取,所以我选择通过原始XML节点解析。
或者你们有什么解决方案吗?

@yujiuyao Aspose.Words 中的图像是以形状对象的形式存在的,如果该形状的包装不是 “与文本内联”,就很难找到形状的真实位置。 您可以将形状包装更改为 “与文本内联”,或者尝试通过 Shape.HasImage | Aspose.Words for .NET 查找图片。

此外,您还可以在此附上您的文件,我们将进行调查并为您提供更多信息。