저는 현재 약 1 년 전쯤 작업을 위해 작성한 웹 응용 프로그램을 유지 관리하고 있습니다. 기본적으로 사용자는 사용자 정의 XHTML 보고서 템플리트를 작성할 수 있습니다. 나는 XmlDocument
, XPathNavigator
등을 사용합니다. al. 데이터를 사용하여 자리 표시 자의 유효성을 검사하고 위생적으로 대체합니다.System.Xml.XmlDocument, System.Xml.XPath.XPathNavigator {ReplaceSelf, OuterXml} : 문서의 자리 표시 자 바꾸기
대부분 작동하지만 실제로는 자리 표시 자 요소를 데이터로 대체하지 않고 자리 표시 자의 텍스트를 데이터 텍스트로 대체한다는 것을 알게되었습니다.
인위적인 예 : 템플릿은 오직 한 번에 처리했기 때문에
<span class="my-placeholder">{CompanyName}</span>
이 될 것입니다 ...
<span class="my-placeholder">Castopulence</span>
이 정말 과거에 문제가 아니었다 사용자가 선택한 데이터 세트를 기준으로 실행하도록 선택한 경우 그러나 이제는 결과 출력을 미리보고 인쇄하기 전에 수정할 수있는 옵션을 제공합니다. 결과는 대체 엔진에 의해 두 번 이상 처리됩니다. 첫 번째는 원래 출력을 생성하고, 수정 된 출력은 "인쇄"됩니다. 대체 엔진은 실제로 데이터 인 자리 표시자를 찾고 대체 할 해당 데이터 요소를 찾지 못하고 프로세스가 예외로 실패합니다.
placeholder.InnerXml = this.Server.HtmlEncode(value);
그래서 내가 원한다면 합리적인 것 같다
원래 코드에 "Castopulence는"(예를 들어) "{회사 이름을}"에서 자리 표시 자 요소의 내용을 변경할 수 XPathNavigator.InnerXml
속성을 사용 이것은 대부분의 경우에 작동하는 것처럼 보인다
placeholder.OuterXml = this.Server.HtmlEncode(value);
, 또는 적어도 나는이하는 가정하지만, 겉으로는 임의 교체는 항상가 발생합니다 철처이 자리 요소를 교체, 내가 대신 XPathNavigator.OuterXml
사용합니다에 "작업 결과로 생성 된 내용이 없습니다."라는 메시지가 표시됩니다. 그래서 나는 그들 중 누구도 일하고 있는지 확실하지 않지만, 이전의 대체를 위해 예외가 발생하지 않았기 때문에 그들이 있다고 가정합니다.
나는 이것이 의미하는 바를 실제로 파악할 수 없으며 예외 메시지와 정확히 일치하는 4 개의 결과 만 표시합니다. 각각은 내가 말하지 않는 언어입니다. 그들을 번역 한 구글은 아무런 관련이 없음을 드러냈다.
실험적으로 동일한 작업을 수행하는 것으로 보이는 XPathNavigator.ReplaceSelf
을 시도했지만 불행히도 같은 내부 호출에서 같은 예외가 발생합니다. 두 경우 모두에서
스택 추적 : System.Xml.DocumentXmlWriter.Close (WriteState의 currentState) System.Xml.XmlWellFormedWriter.Close에서
()
에서
System.Xml.XPath.XPathNavigator에서 .ReplaceSelf (XmlReader newNode)
at System.Xml.XPath.XPathNavigator.ReplaceSelf (문자열 newNode)
... 개인 응용 프로그램 기호가 무시되었습니다.
ReplaceSelf
의 MSDN reference 그것이 발생하는 예외를 설명하지만, 슬로우 유일한 System.InvalidOperationException
예외 때입니다는 "XPathNavigator를가 요소, 텍스트 처리 명령 또는 주석 노드 상에 배치되지 않는다." Visual Studio 디버거에서 요소에 배치되었는지 확인할 수 있습니다. 내 코드도 동의합니다. 자리 표시자를 가리키는 XPathNavigator
은 실제로 System.Xml.XPath.XPathNodeIterator.Current
의 복제본입니다 (모두가 목록에 추가되며 배열로 변환되고 대체 단계에서 반복됩니다).
무엇이 잘못 되었습니까 (예외가 실제로 무엇을 의미합니까?) 그리고 어떻게 수정합니까?
추가합니다 실제로하지 않는 것 예외 (System.Xml.DocumentXmlWriter
)를 던지고 클래스는 MSDN에 문서화 할가 (또는 적어도, 내가 구글 검색이나 MSDN 검색으로 찾을 수 없습니다).
추가 : 문제의 원인이 된 대체 코드의 데이터가 단일 공백 (즉, " "
) 인 것으로 확인되었습니다. 나는 이것이 XPathNavigator
에 대한 문제 일 수있는 이유를 모르지만, 분명히 ... 빈 문자열 (즉, ""
)도 마찬가지입니다. 아마도 문제는 공백으로 만 요소를 대체하려고 시도하는 것입니다. 나는 그것이 왜 문제가되어야하는지 모르겠다.