Visual Studio 클라이언트 응용 프로그램의 xml 데이터 형식 작업

Microsoft SQL Server의 이후 버전에서는 이 기능이 제거됩니다. 새 개발 작업에서는 이 기능을 사용하지 않도록 하고, 현재 이 기능을 사용하는 응용 프로그램은 수정하십시오.

xml 데이터 형식을 사용하면 최상위 요소가 하나 누락된 XML 인스턴스와 같은 XML 조각과 올바른 XML 문서를 SQL Server 데이터베이스에 저장할 수 있습니다. 이러한 디자인 특징 때문에 xml 데이터 형식 인스턴스는 Visual Studio 2005에서 System.Xml.XmlDocument로 반환되는 대신 System.Xml.XmlNode 배열에 매핑되어야 합니다. 이때 조각화된 XML은 지원되지 않습니다.

xml 데이터 형식 인스턴스 값에 포함된 XmlNode 배열에 직접 작업을 수행하다 보면 InnerXmlOuterXml 멤버 속성의 작동 방식이 차이가 있다는 것을 알 수 있습니다. 특히 xml 데이터 형식 인스턴스가 단일 최상위 요소가 있는 XML 문서와 같은 올바른 XML 문서를 구성하는 경우에 그 차이가 더욱 확실해집니다.

예를 들어 SQL Server 끝점의 새 인스턴스(MyServer.sql_endpoint)를 xml 데이터 형식 행 인스턴스 값을 반환하는 웹 메서드(GetSomeXml)가 있는 웹 프록시로 실행하는 다음 코드가 있다고 가정합니다.

MyServer.sql_endpoint proxy = new MyServer.sql_endpoint();
proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
SqlXmlDt = proxy.MyServerdboGetSomeXml();
System.Xml.XmlNode[] nodeArr = SqlXmlDt.Any;
string xmlJustChildren = nodeArr[0].InnerXml;
string xmlWithRoot = nodeArr[0].OuterXml;

반환되는 xml 데이터 형식 행 값의 데이터는 다음과 같습니다.

<root><child/><child/></root>

앞 코드에서처럼 nodeArr[0]의 InnerXml 및 OuterXml 속성이 문자열 변수 쌍(xmlJustChildren 및 xmlWithRoot)에 할당되면 nodeArr[0].InnerXml의 값에는 현재 요소(두 <child/> 요소, <root> 요소는 제외) 내에 있는 노드만 포함되고 nodeArr[0].OuterXml은 XmlNodes의 배열에 있는 모든 노드(<child/> 요소 및 <root> 요소)를 포함하며 정상적으로 작동합니다.

XmlDocument 클래스는 InnerXmlOuterXml 속성을 다르게 구현하므로 위에 설명된 동작은 이 클래스를 사용하여 자주 작업을 수행하는 경우에 일반적으로 나타나는 동작과는 다릅니다. XmlDocument 인스턴스의 경우 문서 인스턴스가 문서의 모든 XmlNodes에 대해 래퍼 요소 역할을 합니다. 여기에는 최상위 루트 노드와 문서에 있는 모든 인라인 DTD 또는 스키마가 포함됩니다. 따라서 XmlDocument.InnerXml의 내용은 XmlDocument.OuterXml의 내용과 같습니다.

이러한 구현상의 특징으로 인해 네이티브 XML 웹 서비스를 사용하는 클라이언트 응용 프로그램에서 SQL Serverxml 데이터 형식 인스턴스 작업을 수행하는 경우에는 System.Xml.XmlDocumentFragment를 사용하는 것이 좋습니다. XmlDocument를 주로 사용하는 개발자는 XmlDocumentFragment 클래스에 보다 익숙하며, 또한 XmlDocumentFragment는 아무런 문제 없이 XmlNode를 받아들입니다.

다음 섹션에서는 클라이언트 응용 프로그램에서 XmlDocumentFragment를 사용하여 SQL Serverxml 데이터 형식 인스턴스 값에 대한 작업을 수행하는 방법을 코드와 함께 간략하게 설명합니다.

XmlDocumentFragment를 사용하여 출력 처리

다음 코드는 XmlNode의 배열을 XmlDocumentFragment에 넣고 XPath 식을 사용하여 해당 조각에서 노드를 선택하는 방법을 보여 줍니다.

System.Xml.XmlDocumentFragment fragOut = SqlXmlDt.Any[0].OwnerDocument.CreateDocumentFragment();

//  Loop over your XmlNode array and populate your XmlDocumentFragment.
foreach (System.Xml.XmlNode xmlnode in SqlXmlDt.Any)
{
    fragOut.AppendChild(xmlnode);
}

//  Loop over your XPath expression/selection for results.
foreach (System.Xml.XmlNode xmlpath in fragOut.SelectNodes("//bar"))
{
    System.Console.WriteLine(xmlpath.OuterXml);
}

XmlDocumentFragment를 사용하여 문자열로 입력 작성

다음은 XmlDocumentFragment의 InnerXml 속성에 문자열 할당을 사용하여 XmlNode의 입력 배열을 작성하는 방법을 보여 주는 예제입니다.

//  Create an owning XmlDocument
System.Xml.XmlDocument xmldoc = new System.Xml.XmlDocument();

//  Create your XmlDocumentFragment.
System.Xml.XmlDocumentFragment fragIn = xmldoc.CreateDocumentFragment();

//  Fill the XmlDocumentFragment with a string.
fragIn.InnerXml =
"  <a>" +
"    <b>inputvalue</b>" +
"  </a>" +
"  topstuff" +
"  <b/>";

//  Create an XmlNode array (should never require more than one element).
System.Xml.XmlNode[] xmlnodes = new System.Xml.XmlNode[1];

//  Put the XmlDocumentFragment in the array and fill your XmlDt
xmlnodes[0] = (System.Xml.XmlNode) fragIn;
SqlXmlDt.Any = xmlnodes;

XmlDocumentFragment를 사용하여 파일에서 입력 작성

XmlDocumentFragment 클래스는 XmlDocument 클래스보다 인스턴스를 채우는 방법에 있어서 제한적입니다. 다음 예에서는 System.Xml.XmlReader를 사용하여 파일에서 XmlDocumentFragment 인스턴스를 채우는 방법을 보여 줍니다.

//  Create an owning XmlDocument.
System.Xml.XmlDocument xmldoc = new System.Xml.XmlDocument();

//  Create your XmlDocumentFragment.
System.Xml.XmlDocumentFragment fragIn = xmldoc.CreateDocumentFragment();

//  Build an XmlReader from the file.
System.Xml.XmlReaderSettings rs = new System.Xml.XmlReaderSettings();
rs.ConformanceLevel = System.Xml.ConformanceLevel.Fragment;
System.Xml.XmlReader reader = System.Xml.XmlReader.Create("c:\\file.xml", rs);

//  Populate the fragment with the nodes from the XmlReader.
System.Xml.XmlNode child;
while (null != (child = xmldoc.ReadNode(reader)))
     fragIn.AppendChild(child);

//  Create your XmlNode array (should never require more than one element)
    System.Xml.XmlNode[] xmlnodes = new System.Xml.XmlNode[1];

//  Put the XmlDocumentFragment in the array and fill our XmlDt.
xmlnodes[0] = (System.Xml.XmlNode) fragIn;
SqlXmlDt.Any = xmlnodes;