如何从 ContentControl 的 Range.WordOpenXML 的存储值而不是其语法值中获取纯超链接文本?
how to get plain hyperlink text from stored value of ContentControl's Range.WordOpenXML, instead of its syntax value?
我在 Word 中有超链接 ContentControl
如下所示
http://www.yahoo.com
我正在存储它的值,以便稍后使用
var encoded = Convert.ToBase64String(Encoding.UTF8.GetBytes(cc.Range.WordOpenXML));
当我再次解码它并得到它的文本内容时,
var decoded = Encoding.UTF8.GetString(Convert.FromBase64String(encoded));
XDocument doc = XDocument.Parse(decoded);
string ccText = doc.Descendants(XName.Get("document", "http://schemas.openxmlformats.org/wordprocessingml/2006/main")).FirstOrDefault().Value;
由此我得到 HYPERLINK "http://www.yahoo.com/" \o "Follow link"
而不是 http://www.yahoo.com
,期望结果是 http://www.yahoo.com
。
电子邮件的情况也是如此,其中获取 HYPERLINK "mailto:abc@xyz.com" abc@xyz.com
而不是 abc@xyz.com
如果我在上面的方法中使用 cc.Range.WordOpenXML
来获取文本内容,而不是解码的内容,那么我会得到正确的值 http://www.yahoo.com
当我比较解码后的 XML 和编码前的 XML 时,似乎 XML 的超链接节点正在被修改,我认为这是这个问题的根本原因。
原始 XML 编码前: 从 doc.Descendants(XName.Get("document", "http://schemas.openxmlformats.org/wordprocessingml/2006/main"))
检索
<w:hyperlink r:id="rId4" w:tooltip="Follow link" w:history="1">
<w:r w:rsidRPr="00E862A6">
<w:rPr>
<w:rStyle w:val="Hyperlink" />
</w:rPr>
<w:t>http://www.yahoo.com</w:t>
</w:r>
</w:hyperlink>
解码后更改XML结构:
<w:ins w:id="5" w:author="xxxxxx xxxxxx" w:date="2021-03-30T16:42:00Z">
<w:r>
<w:instrText xml:space="preserve"> HYPERLINK "http://www.yahoo.com/" \o "Follow link" </w:instrText>
</w:r>
<w:r>
<w:fldChar w:fldCharType="separate" />
</w:r>
<w:r w:rsidRPr="00E862A6">
<w:rPr>
<w:rStyle w:val="Hyperlink" />
</w:rPr>
<w:t>http://www.yahoo.com</w:t>
</w:r>
<w:r>
<w:rPr>
<w:rStyle w:val="Hyperlink" />
</w:rPr>
<w:fldChar w:fldCharType="end" />
</w:r>
</w:ins>
有什么方法可以像上述用例一样从 Word ContentControl
的 Range
存储中获取纯超链接文本而不是其语法值?不确定我是不是做错了什么。
对于这个根本原因我没有找到任何解决方案,所以直到我找到方法从没有 HYPERLINK 语法的范围中检索有效的必需文本,
不是最好的方法或完美的解决方案,但作为目前的解决方法,我从字符串中删除了 HYPERLINK \"
和 \o \"Follow link\"
,以便在找到它在字符串中的位置后仅获得 http://www.yahoo.com/
。
期待实际解决方案。
我在 Word 中有超链接 ContentControl
如下所示
http://www.yahoo.com
我正在存储它的值,以便稍后使用
var encoded = Convert.ToBase64String(Encoding.UTF8.GetBytes(cc.Range.WordOpenXML));
当我再次解码它并得到它的文本内容时,
var decoded = Encoding.UTF8.GetString(Convert.FromBase64String(encoded));
XDocument doc = XDocument.Parse(decoded);
string ccText = doc.Descendants(XName.Get("document", "http://schemas.openxmlformats.org/wordprocessingml/2006/main")).FirstOrDefault().Value;
由此我得到 HYPERLINK "http://www.yahoo.com/" \o "Follow link"
而不是 http://www.yahoo.com
,期望结果是 http://www.yahoo.com
。
电子邮件的情况也是如此,其中获取 HYPERLINK "mailto:abc@xyz.com" abc@xyz.com
而不是 abc@xyz.com
如果我在上面的方法中使用 cc.Range.WordOpenXML
来获取文本内容,而不是解码的内容,那么我会得到正确的值 http://www.yahoo.com
当我比较解码后的 XML 和编码前的 XML 时,似乎 XML 的超链接节点正在被修改,我认为这是这个问题的根本原因。
原始 XML 编码前: 从 doc.Descendants(XName.Get("document", "http://schemas.openxmlformats.org/wordprocessingml/2006/main"))
<w:hyperlink r:id="rId4" w:tooltip="Follow link" w:history="1">
<w:r w:rsidRPr="00E862A6">
<w:rPr>
<w:rStyle w:val="Hyperlink" />
</w:rPr>
<w:t>http://www.yahoo.com</w:t>
</w:r>
</w:hyperlink>
解码后更改XML结构:
<w:ins w:id="5" w:author="xxxxxx xxxxxx" w:date="2021-03-30T16:42:00Z">
<w:r>
<w:instrText xml:space="preserve"> HYPERLINK "http://www.yahoo.com/" \o "Follow link" </w:instrText>
</w:r>
<w:r>
<w:fldChar w:fldCharType="separate" />
</w:r>
<w:r w:rsidRPr="00E862A6">
<w:rPr>
<w:rStyle w:val="Hyperlink" />
</w:rPr>
<w:t>http://www.yahoo.com</w:t>
</w:r>
<w:r>
<w:rPr>
<w:rStyle w:val="Hyperlink" />
</w:rPr>
<w:fldChar w:fldCharType="end" />
</w:r>
</w:ins>
有什么方法可以像上述用例一样从 Word ContentControl
的 Range
存储中获取纯超链接文本而不是其语法值?不确定我是不是做错了什么。
对于这个根本原因我没有找到任何解决方案,所以直到我找到方法从没有 HYPERLINK 语法的范围中检索有效的必需文本,
不是最好的方法或完美的解决方案,但作为目前的解决方法,我从字符串中删除了 HYPERLINK \"
和 \o \"Follow link\"
,以便在找到它在字符串中的位置后仅获得 http://www.yahoo.com/
。
期待实际解决方案。