@ Gohlool - Мой подход предполагал, что на странице, отображаемой TWebBrowser, есть ссылка на файл XML, и пользователь щелкает ее. Из вашего ответа я должен предположить, что это не ваш случай. Итак, мой вопрос: как вы узнаете, что XML-файл готов к загрузке и как узнать его адрес?

ользую элемент управления WebBrowser в моих тестовых проектах Delphi и .Net C #, чтобы перейти к локальному тестовому XML-файлу и попытаться сохранить содержимое обратно в XML-файл в .NetDocumentCompleted Событие и в ДельфиonNavigateComple2 мероприятие.

Проблема в том, что я всегда получаю HTML, который будет преобразован браузером для просмотра (проверьте вывод: я сохранил его, используя следующий код)

procedure TForm1.SaveHTMLSourceToFile(const FileName: string;
  WB: TWebBrowser);
var
  PersistStream: IPersistStreamInit;
  FileStream: TFileStream;
  Stream: IStream;
  SaveResult: HRESULT;
begin
  PersistStream := WB.Document as IPersistStreamInit;
  FileStream := TFileStream.Create(FileName, fmCreate);
  try
    Stream := TStreamAdapter.Create(FileStream, soReference) as IStream;
    SaveResult := PersistStream.Save(Stream, True);
    if FAILED(SaveResult) then
      MessageBox(Handle, 'Fail to save source', 'Error', 0);
  finally
    FileStream.Free;
  end;
end;

Ну, я перепробовал почти все, искал везде, но до сих пор не нашел ничего полезного. С помощью следующего кода Delphi мне удалось показать ИСТОЧНИК, который работает (это означает, что источник находится где-то там), но я не могу его использовать, так как он посеет диалог, и будет нелегко получить данные и закрыть этот диалог (в моем тестовом примере) Я получаю notepad.exe с моим содержимым xml)

  AWebBrowser.Document.QueryInterface(IOleCommandTarget, CmdTarget) ;
  if CmdTarget <> nil then
  try
    CmdTarget.Exec(PtrGUID, HTMLID_VIEWSOURCE, 0, vaIn, vaOut) ;
  finally
    CmdTarget._Release;
  end;

Мне также удалось вызвать вызов SAVE AS с флагом xxx-HIDE-xxx, но он подключает IE 5, и будет отображаться диалог сохранения как (флаг скрытия будет игнорироваться).

Я также пытался получить данные XML из кэша (Cache API), но в моем случае я ничего не получу и 2. что если на компьютере клиента кэширование отключено? ;-)

InnerText или InnerHTML atc. не могут быть использованы, так как они содержат - и + char и не представляют оригинальные RAW-данные (ИСТОЧНИК)

Просто для вашего сведения: я не могу использовать компоненты WebClient или Indy для доступа к XML. Я также не могу играть в качестве Прокси, так как проблема с открытием портов (скажем, 8080) на клиентской машине является болезненной с привилегированным доступом пользователя.

Итак, вот я и спрашиваю вас, есть ли у вас идеи, как решить мою проблему?

Заранее спасибо

вход:

<?xml version="1.0" encoding="UTF-8"?>
<test><data>xxxx</data></test>

выход:

<HTML><HEAD>
<STYLE>BODY{font:x-small 'Verdana';margin-right:1.5em}
.c{cursor:hand}
.b{color:red;font-family:'Courier New';font-weight:bold;text-decoration:none}
.e{margin-left:1em;text-indent:-1em;margin-right:1em}
.k{margin-left:1em;text-indent:-1em;margin-right:1em}
.t{color:#990000}
.xt{color:#990099}
.ns{color:red}
.dt{color:green}
.m{color:blue}
.tx{font-weight:bold}
.db{text-indent:0px;margin-left:1em;margin-top:0px;margin-bottom:0px;padding-left:.3em;border-left:1px solid #CCCCCC;font:small Courier}
.di{font:small Courier}
.d{color:blue}
.pi{color:blue}
.cb{text-indent:0px;margin-left:1em;margin-top:0px;margin-bottom:0px;padding-left:.3em;font:small Courier;color:#888888}
.ci{font:small Courier;color:#888888}
PRE{margin:0px;display:inline}</STYLE>
<SCRIPT><!--
function f(e){
if (e.className=="ci"){if (e.children(0).innerText.indexOf("\n")>0) fix(e,"cb");}
if (e.className=="di"){if (e.children(0).innerText.indexOf("\n")>0) fix(e,"db");}
e.id="";
}
function fix(e,cl){
e.className=cl;
e.style.display="block";
j=e.parentElement.children(0);
j.className="c";
k=j.children(0);
k.style.visibility="visible";
k.href="#";
}
function ch(e){
mark=e.children(0).children(0);
if (mark.innerText=="+"){
mark.innerText="-";
for (var i=1;i<e.children.length;i++)
e.children(i).style.display="block";
}
else if (mark.innerText=="-"){
mark.innerText="+";
for (var i=1;i<e.children.length;i++)
e.children(i).style.display="none";
}}
function ch2(e){
mark=e.children(0).children(0);
contents=e.children(1);
if (mark.innerText=="+"){
mark.innerText="-";
if (contents.className=="db"||contents.className=="cb")
contents.style.display="block";
else contents.style.display="inline";
}
else if (mark.innerText=="-"){
mark.innerText="+";
contents.style.display="none";
}}
function cl(){
e=window.event.srcElement;
if (e.className!="c"){e=e.parentElement;if (e.className!="c"){return;}}
e=e.parentElement;
if (e.className=="e") ch(e);
if (e.className=="k") ch2(e);
}
function ex(){}
function h(){window.status=" ";}
document.onclick=cl;
--></SCRIPT>
</HEAD>
<BODY class="st"><DIV class="e">
<SPAN class="b">&nbsp;</SPAN>
<SPAN class="m">&lt;?</SPAN><SPAN class="pi">xml version="1.0" encoding="UTF-8" </SPAN><SPAN class="m">?&gt;</SPAN>
</DIV>
<DIV class="e">
<DIV class="c" STYLE="margin-left:1em;text-indent:-2em"><A href="#" onclick="return false" onfocus="h()" class="b">-</A>
<SPAN class="m">&lt;</SPAN><SPAN class="t">test</SPAN><SPAN class="m">&gt;</SPAN></DIV>
<DIV><DIV class="e"><DIV STYLE="margin-left:1em;text-indent:-2em">
<SPAN class="b">&nbsp;</SPAN>
<SPAN class="m">&lt;</SPAN><SPAN class="t">data</SPAN><SPAN class="m">&gt;</SPAN><SPAN class="tx">xxxx</SPAN><SPAN class="m">&lt;/</SPAN><SPAN class="t">data</SPAN><SPAN class="m">&gt;</SPAN>
</DIV></DIV>
<DIV><SPAN class="b">&nbsp;</SPAN>
<SPAN class="m">&lt;/</SPAN><SPAN class="t">test</SPAN><SPAN class="m">&gt;</SPAN></DIV>
</DIV></DIV>
</BODY>
</HTML>

Ответы на вопрос(2)

Ваш ответ на вопрос