다음을 통해 공유


서식 있는 텍스트 및 웹 서비스

Microsoft InfoPath 2010에서는 양식의 서식 있는 텍스트 상자 컨트롤을 웹 서비스에서 받은 XML 요소에 바인딩하고 서식 있는 텍스트 상자 컨트롤의 데이터를 웹 서비스를 통해 XML 요소에 전송할 수 있습니다. 해당 요소는 XHTML(eXtensible HyperText Markup Language) 형식을 준수해야 합니다. 예를 들어 서식 있는 텍스트가 포함된 MyRichTextElement라는 요소의 스키마에는 다음 XML 스키마 정의가 포함됩니다.

<xsd:element name="MyRichTextElement"> 
    <xsd:complexType mixed="true"> 
        <xsd:sequence> 
            <xsd:any namespace="http://www.w3.org/1999/xhtml" processContents="lax" 
                minOccurs="0" maxOccurs="unbounded"/> 
        </xsd:sequence> 
    </xsd:complexType> 
</xsd:element>

서식 있는 텍스트 상자 컨트롤을 XHTML 요소와 바인딩하려면 먼저 해당 요소를 래퍼 노드로 래핑해야 하며, 이 래퍼 노드는 임의의 네임스페이스에 속할 수 있습니다. 래퍼 노드는 다음과 같은 형태일 수 있습니다.

<xhtmlNode xmlns="http:// someNamespace"> 
    <div xmlns="http://www.w3.org/1999/xhtml">Your rich text here</div> 
</xhtmlNode>

이 항목에서는 XHTML을 보내고 받을 수 있는 웹 서비스를 만드는 프로세스와 InfoPath를 사용하여 웹 서비스 매개 변수에 바인딩하는 방법을 간략히 설명합니다. 그러나 이러한 웹 서비스를 만드는 방법에 대한 자세한 지침은 제공하지 않습니다. 이 항목에서는 사용자가 이미 웹 서비스를 사용한 작업에 어느 정도 익숙하다고 가정합니다.

XHTML을 보내고 받는 웹 서비스를 디자인하는 방법

예로 든 웹 서비스는 보내고 받는 XHTML 데이터를 서버의 XML 파일에 저장합니다. out.xml이라는 이름의 이 파일은 XHTML 데이터를 저장하는 데이터 원본 역할을 합니다. 클라이언트 응용 프로그램이 XHTML 데이터 원본과 연결될 수 있도록 getXhtml 및 setXhtml의 두 가지 웹 메서드가 노출됩니다. getXhtml 웹 서비스 메서드는 InfoPath의 서식 있는 텍스트 상자 컨트롤에 바인딩할 수 있는 XHTML이 포함된 XmlNode를 반환합니다. setXhtml 웹 서비스 메서드는 XmlNode를 데이터로 받아들여 out.xml 파일에 저장합니다.

참고 사항참고 사항

이러한 웹 메서드에는 System.IO 및 System.Xml 네임스페이스를 참조하는 using 문이 필요합니다.

getXhtml 웹 서비스 메서드는 C 드라이브의 Data 폴더에 있는 out.xml 파일에서 반환될 XML 데이터를 로드합니다. 파일을 찾을 수 없거나 파일에 유효한 XML이 포함되어 있지 않아 실패할 경우 이 메서드는 XHTML 네임스페이스를 참조하는 빈 DIV HTML 요소를 반환합니다.

[WebMethod]
public XmlNode getXhtml()  
{  
            // This is the returned XmlDocument upon Query from InfoPath 
            XmlDocument document = new XmlDocument(); 
 
            // Create a wrapping node with the name of the rich text field. 
            // The "http://someNameSpace" can be any arbitrary namespace 
            XmlNode richNode = document.CreateNode 
                        (XmlNodeType.Element, "MyRichTextElement", "http://someNameSpace"); 
 
            // Temporary XmlDocument 
            XmlDocument tempDocument = new XmlDocument(); 
            try 
            { 
                // Read the saved rich text data from the local machine 
                tempDocument.Load(@"c:\Data\out.xml"); 
            } 
            catch (XmlException) 
            { 
                // If the file does not exist or content is not valid XML 
                tempDocument.LoadXml("<div xmlns=\"http://www.w3.org/1999/xhtml\"></div>"); 
            } 
 
            // Add the file content to the xml 
            richNode.AppendChild 
                        (document.ImportNode(tempDocument.DocumentElement, true)); 
 
            return richNode; 
}  

setXhtml 웹 서비스 메서드는 InfoPath 양식의 서식 있는 텍스트 상자 컨트롤에서 XHTML을 받아들입니다. 웹 서비스에서는 노드 목록을 지원하지 않으므로 여러 줄이 포함된 서식 있는 텍스트 필드가 웹 서비스에 보내지면 웹 서비스에서 첫 번째 줄만 받아들이고 나머지는 무시합니다.

예제 setXhtml 메서드에서는 최상위 XML 노드를 받는다고 가정하며, 이 노드는 대부분의 경우 DIV 요소에 래핑됩니다. 서식 있는 텍스트 상자 컨트롤 내 텍스트에 서식이 없는 경우와 같이 받은 XML에 래핑 요소가 포함되어 있지 않으면 이 메서드는 NodeType 속성에서 전달된 XML이 텍스트 노드임을 나타내는지 여부를 확인하여 이를 감지합니다. XML이 텍스트 노드이면 메서드는 DIV 요소를 만들고 텍스트 노드 콘텐츠를 DIV에 복사하여 웹 서비스에 보내진 텍스트가 있는 텍스트 노드 자식을 DIV가 포함하도록 합니다. 이 메서드에서 받은 XML은 C 드라이브의 Data 폴더에 있는 out.xml 파일에 기록됩니다.

참고 사항참고 사항

예제 setXhtml 메서드는 모든 크기의 XHTML 데이터를 받아들이도록 작성되었습니다. 실제로 사용할 때에는 항상 전송되는 데이터 양을 확인하고 전송 가능한 데이터 양의 상한값을 설정해야 합니다.

[WebMethod]  
public void setXhtml(XmlNode xn)  
{  
            XmlDocument document = new XmlDocument(); 
 
            if (xn == null) 
            { 
                // If nothing was submitted or the rich text field is empty, 
                // create a DIV that references the XHTML namespace 
                XmlElement div = document.CreateElement("div", "http://www.w3.org/1999/xhtml"); 
                // Copy the node to our own XmlDocument 
                document.AppendChild(div); 
            } 
            if (xn.NodeType == XmlNodeType.Text) 
            { 
                // If plain text is passed in, wrap it in a DIV 
                // that references the XHTML namespace 
                XmlElement div = document.CreateElement("div", "http://www.w3.org/1999/xhtml"); 
                // Copy the text to the DIV. 
                div.AppendChild(document.ImportNode(xn, true)); 
                // Copy the node to our own XmlDocument 
                document.AppendChild(div); 
            } 
            else 
            { 
                // Copy the node to our own XmlDocument 
                document.AppendChild(document.ImportNode(xn, true)); 
            } 
 
            // Save the file to the local machine 
            document.Save(@"c:\Data\out.xml"); 
}  

예제 웹 서비스와 데이터를 교환하는 InfoPath 양식을 만드는 방법

다음 단계를 수행하여 양식을 만든 다음 예제 웹 서비스를 테스트합니다.

예제 웹 서비스에 연결되는 양식을 만들려면

  1. InfoPath 양식 디자이너를 엽니다.

  2. 새로 만들기 탭의 고급 양식 서식 파일에서 웹 서비스를 두 번 클릭합니다.

  3. 데이터 연결 마법사 대화 상자에서 데이터 받기를 선택하고 다음을 클릭합니다.

  4. 예제 웹 서비스 메서드가 포함된 웹 서비스의 주소를 입력하고 다음을 클릭합니다.

  5. 받기 메서드에 대해 getXhtml을 작업으로 선택하고 다음을 클릭합니다.

  6. getXHTML 웹 서비스 메서드에는 매개 변수가 사용되지 않으므로 다음을 클릭합니다.

  7. 마침을 클릭합니다.

  8. 데이터 탭의 작업 전송 그룹에서 다른 위치로를 클릭하고 웹 서비스를 클릭하여 동일한 웹 서비스를 사용하여 데이터를 전송합니다.

  9. 예제 웹 서비스 메서드가 포함된 웹 서비스의 주소를 입력하고 다음을 클릭합니다.

  10. 전송 메서드에 대해 setXhtml을 작업으로 선택하고 다음을 클릭합니다.

  11. 수정을 클릭하고 dataFields 폴더, s0:getXhtmlResponse 폴더, getXhtmlResult 폴더를 차례로 확장한 다음 MyRichTextElement 요소를 선택하고 다음을 클릭합니다.

  12. 마침을 클릭합니다.

  13. 필드 작업창에서 dataFields 폴더를 확장합니다.

  14. s0:getXhtmlResponsegetXhtmlResult 폴더를 확장하고 MyRichTextElement 요소를 양식으로 끌어옵니다. InfoPath에서 MyRichTextElement 요소가 XHTML 요소임을 인식하고 서식 있는 텍스트 상자 컨트롤을 사용하여 해당 요소에 바인딩합니다.

  15. 양식을 저장 또는 게시합니다.

양식을 테스트하려면 양식을 열고 그림, 표, 서식이 지정된 텍스트 등의 서식 있는 텍스트 콘텐츠를 입력합니다. 리본에서 전송을 클릭하여 서식 있는 텍스트 콘텐츠를 서버의 out.xml 파일에 저장합니다. 보기 탭에서 쿼리를 클릭하고 양식의 쿼리 실행 단추를 클릭합니다. 서식 있는 텍스트 상자 컨트롤에 out.xml 파일의 XHTML 콘텐츠가 표시되어야 합니다. 서식 있는 텍스트 필드에 여러 줄이 포함되는 경우 웹 서비스에서는 첫 번째 줄만 받아들이고 나머지는 무시합니다.