2011-05-04 2 views
1

저는 현재 약 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)
... 개인 응용 프로그램 기호가 무시되었습니다.

ReplaceSelfMSDN reference 그것이 발생하는 예외를 설명하지만, 슬로우 유일한 System.InvalidOperationException 예외 때입니다는 "XPathNavigator를가 요소, 텍스트 처리 명령 또는 주석 노드 상에 배치되지 않는다." Visual Studio 디버거에서 요소에 배치되었는지 확인할 수 있습니다. 내 코드도 동의합니다. 자리 표시자를 가리키는 XPathNavigator은 실제로 System.Xml.XPath.XPathNodeIterator.Current의 복제본입니다 (모두가 목록에 추가되며 배열로 변환되고 대체 단계에서 반복됩니다).

무엇이 잘못 되었습니까 (예외가 실제로 무엇을 의미합니까?) 그리고 어떻게 수정합니까?

추가합니다 실제로하지 않는 것 예외 (System.Xml.DocumentXmlWriter)를 던지고 클래스는 MSDN에 문서화 할가 (또는 적어도, 내가 구글 검색이나 MSDN 검색으로 찾을 수 없습니다).

추가 : 문제의 원인이 된 대체 코드의 데이터가 단일 공백 ​​(즉, " ") 인 것으로 확인되었습니다. 나는 이것이 XPathNavigator에 대한 문제 일 수있는 이유를 모르지만, 분명히 ... 빈 문자열 (즉, "")도 마찬가지입니다. 아마도 문제는 공백으로 만 요소를 대체하려고 시도하는 것입니다. 나는 그것이 왜 문제가되어야하는지 모르겠다.

답변

1

나는 또한 같은 오류 메시지가 점점 오전 : iterator.count = 0 일 경우

XmlWriter writer = replaceTextIterator.Current.ReplaceRange(replaceTextIterator.Current); 

XPathNodeIterator iterator5 = replaceTextIterator.Current.SelectChildren(XPathNodeType.All); 
while (iterator5.MoveNext()) 
{ 
    writer.WriteNode(iterator5.Current, true); 
} 

writer.Close(); 

, 나는 그 오류 메시지가 작업의 결과로 생성

하는 콘텐츠, 노드를 작성하지 않고 xmlwriter 객체를 닫지 마십시오.

0

이것은 질문에 대한 대답이 아닙니다. 어쨌든 꽤 오래되었습니다.하지만 리프 노드에서 InnerXml 값을 설정할 때 발생하는 No content generated as the result of the operation.의 원인을 찾으려고 여기에 온 사람들에게는 성공을 알 수 있습니다 대신 SetValue을 사용하십시오.

리프 노드에서 중요한 이유는 확실하지 않습니다. 간단하게 문자열을 노드로 파싱하는 것이 오류라고 생각합니다.

Value와 InnerXml in this stackoverflow question 또는 in this InfoPathDev question의 차이점에 대한 자세한 정보를 참조하십시오. (필자 의견으로는이 것이 더 유용합니다).

그래서 나는이 노드에 위치한 XPathNavigator를있는 경우 :

<my:group2 my:field4="Hi"> 
    <my:field1>Hello</my:field1> 
    <my:field2 my:field5="yay">Goodbye</my:field2> 
    <my:field3></my:field3> 
</my:group2> 

InnerXml would be: 

     <my:field1>Hello</my:field1> 
     <my:field2 my:field5="yay">Goodbye</my:field2> 
     <my:field3></my:field3> 

And Value would be: 

     Hello 
     Goodbye 

For leaf nodes, InnerXml and Value should typically be the same, but I'd suggest using Value for getting a node's value as that's what it's intended for.