Answered
Get IHyperlink from IIDXMLElement
- February 20, 2022
- 2 replies
- 686 views
Hi,
I have a very simple test document with only one hyperlink.

I tried to to get IHyperlink via IHyperlinkSource but I got always NULL value for QueryHyperlinkSourceAt function.
textValue is correct so I think the dataModel and range.Start() parameter is right for QueryHyperlinkSourceAt function.
To get hyperlinks by IHyperlinktable is not solution for me because I would like to change the destination URL by en XML attribute "hyperlinkpattern" so I need to get IHyperlink via IIDXMLElement.
My code:
XMLReference xmlref = iter->first;
InterfacePtr<IIDXMLElement> elem(xmlref.Instantiate());
WideString elemName = elem->GetTagString();
WideString hyperlinkPattern = elem->GetAttributeValue(WideString("hyperlinkpattern"));
do {
XMLContentIterator iter(elem->begin());
InDesign::TextRange range = *iter;
if (!range.IsValid()) {
break;
}
InterfacePtr<ITextModel> textModel(range.QueryModel());
if (!textModel) {
break;
}
WideString textValue("");
TextIterator begin_(textModel, range.Start());
TextIterator end_(textModel, range.End());
for (TextIterator iterText = begin_; iterText != end_; iterText++) {
const UTF32TextChar characterCode = *iterText;
textValue.Append(characterCode);
}
InterfacePtr<IHyperlinkSource> hyperlinkSource(static_cast<IHyperlinkSource*>(Utils<IHyperlinkUtils>()->QueryHyperlinkSourceAt(textModel, range.Start())));
if (!hyperlinkSource) // <------------------ hyperlinkSource ALWAYS NULL
break;
InterfacePtr<IHyperlink> hyperlink(db, hyperlinkSource->GetOwningHyperlink(), IID_IHYPERLINK);
InterfacePtr<IHyperlinkDestination> hyperlinkDestination(db, hyperlink->GetDestinationUID(), IID_IHYPERLINKDESTINATION);
hyperlinkDestination->SetName(PMString("https://adobe.com")); // Redirect URL to adobe
} while (kFalse);
I appreciate any help.
Thx
Karoly
