이 클래스는 XPathNavigator XML 문서의 노드 및 값을 수정하는 데 사용되는 메서드 집합을 제공합니다. 이러한 메서드를 사용하려면 XPathNavigator 개체를 편집할 수 있어야 합니다. 즉, CanEdit 속성이 true
일 수 있어야 합니다.
XPathNavigatorXML 문서를 편집할 수 있는 개체는 클래스의 CreateNavigator 메서드에 XmlDocument 의해 만들어집니다. XPathNavigator 클래스에서 XPathDocument 생성한 개체는 읽기 전용이며, XPathNavigator 개체에서 생성된 XPathDocument 개체의 편집 메서드를 사용하려고 하면 NotSupportedException을 초래합니다.
편집 가능한 XPathNavigator 개체를 만드는 방법에 대한 자세한 내용은 XPathDocument 및 XmlDocument를 사용하여 XML 데이터 읽기를 참조하세요.
노드 수정
노드의 값을 변경하는 간단한 방법은 SetValue 클래스의 SetTypedValue 및 XPathNavigator 메서드를 사용하는 것입니다.
다음 표에서는 이러한 메서드가 서로 다른 노드 형식에 미치는 영향을 나열합니다.
XPathNodeType | 변경된 데이터 |
---|---|
Root | 지원되지 않습니다. |
Element | 요소의 내용입니다. |
Attribute | 특성의 값입니다. |
Text | 텍스트 내용입니다. |
ProcessingInstruction | 대상을 제외한 콘텐츠입니다. |
Comment | 주석의 내용입니다. |
Namespace | 지원되지 않습니다. |
또한 이 클래스는 XPathNavigator 노드를 삽입하고 제거하는 데 사용되는 메서드 집합을 제공합니다. XML 문서에서 노드를 삽입하고 제거하는 방법에 대한 자세한 내용은 XPathNavigator를 사용하여 XML 데이터 삽입 및 XPathNavigator 항목을 사용하여 XML 데이터 제거 항목을 참조하세요.
형식화되지 않은 값 수정
메서드는 매개 변수로 전달된 형식이 지정되지 않은 SetValue 값을 string
객체가 현재 위치한 노드 XPathNavigator의 값으로 단순히 삽입합니다. 스키마 정보를 사용할 수 있는 경우 값은 형식 없이 삽입되거나 노드 형식에 따라 새 값이 유효한지 확인하지 않고 삽입됩니다.
다음 예제에서는 SetValue 메서드를 사용하여 price
파일의 모든 contosoBooks.xml
요소를 업데이트합니다.
XmlDocument document = new XmlDocument();
document.Load("contosoBooks.xml");
XPathNavigator navigator = document.CreateNavigator();
XmlNamespaceManager manager = new XmlNamespaceManager(navigator.NameTable);
manager.AddNamespace("bk", "http://www.contoso.com/books");
foreach (XPathNavigator nav in navigator.Select("//bk:price", manager))
{
if (nav.Value == "11.99")
{
nav.SetValue("12.99");
}
}
Console.WriteLine(navigator.OuterXml);
Dim document As XmlDocument = New XmlDocument()
document.Load("contosoBooks.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()
Dim manager As XmlNamespaceManager = New XmlNamespaceManager(navigator.NameTable)
manager.AddNamespace("bk", "http://www.contoso.com/books")
For Each nav As XPathNavigator In navigator.Select("//bk:price", manager)
If nav.Value = "11.99" Then
nav.SetValue("12.99")
End If
Next
Console.WriteLine(navigator.OuterXml)
이 예제에서는 파일을 입력으로 사용합니다 contosoBooks.xml
.
<?xml version="1.0" encoding="utf-8" ?>
<bookstore xmlns="http://www.contoso.com/books">
<book genre="autobiography" publicationdate="1981-03-22" ISBN="1-861003-11-0">
<title>The Autobiography of Benjamin Franklin</title>
<author>
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
</author>
<price>8.99</price>
</book>
<book genre="novel" publicationdate="1967-11-17" ISBN="0-201-63361-2">
<title>The Confidence Man</title>
<author>
<first-name>Herman</first-name>
<last-name>Melville</last-name>
</author>
<price>11.99</price>
</book>
<book genre="philosophy" publicationdate="1991-02-15" ISBN="1-861001-57-6">
<title>The Gorgias</title>
<author>
<name>Plato</name>
</author>
<price>9.99</price>
</book>
</bookstore>
형식화된 값 수정
노드의 형식이 W3C XML 스키마 단순 형식인 경우 메서드에 의해 SetTypedValue 삽입된 새 값은 값을 설정하기 전에 단순 형식의 패싯에 대해 검사됩니다. 노드의 형식에 따라 새 값이 유효하지 않은 경우(예: 형식-1
이 있는 요소의 xs:positiveInteger
값 설정) 예외가 발생합니다.
다음 예제에서는 price
파일의 첫 번째 book
요소에 있는 contosoBooks.xml
요소의 값을 DateTime 값으로 변경하려고 시도합니다. XML 스키마 형식이 price
파일에서 xs:decimal
로 정의되어 있기 때문에 contosoBooks.xsd
요소에서 예외가 발생합니다.
Dim settings As XmlReaderSettings = New XmlReaderSettings()
settings.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd")
settings.ValidationType = ValidationType.Schema
Dim reader As XmlReader = XmlReader.Create("contosoBooks.xml", settings)
Dim document As XmlDocument = New XmlDocument()
document.Load(reader)
Dim navigator As XPathNavigator = document.CreateNavigator()
navigator.MoveToChild("bookstore", "http://www.contoso.com/books")
navigator.MoveToChild("book", "http://www.contoso.com/books")
navigator.MoveToChild("price", "http://www.contoso.com/books")
navigator.SetTypedValue(DateTime.Now)
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd");
settings.ValidationType = ValidationType.Schema;
XmlReader reader = XmlReader.Create("contosoBooks.xml", settings);
XmlDocument document = new XmlDocument();
document.Load(reader);
XPathNavigator navigator = document.CreateNavigator();
navigator.MoveToChild("bookstore", "http://www.contoso.com/books");
navigator.MoveToChild("book", "http://www.contoso.com/books");
navigator.MoveToChild("price", "http://www.contoso.com/books");
navigator.SetTypedValue(DateTime.Now);
이 예제에서는 파일을 입력으로 사용합니다 contosoBooks.xml
.
<?xml version="1.0" encoding="utf-8" ?>
<bookstore xmlns="http://www.contoso.com/books">
<book genre="autobiography" publicationdate="1981-03-22" ISBN="1-861003-11-0">
<title>The Autobiography of Benjamin Franklin</title>
<author>
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
</author>
<price>8.99</price>
</book>
<book genre="novel" publicationdate="1967-11-17" ISBN="0-201-63361-2">
<title>The Confidence Man</title>
<author>
<first-name>Herman</first-name>
<last-name>Melville</last-name>
</author>
<price>11.99</price>
</book>
<book genre="philosophy" publicationdate="1991-02-15" ISBN="1-861001-57-6">
<title>The Gorgias</title>
<author>
<name>Plato</name>
</author>
<price>9.99</price>
</book>
</bookstore>
또한 이 예제에서는 contosoBooks.xsd
입력으로 사용합니다.
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.contoso.com/books" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="bookstore">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="book">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string" />
<xs:element name="author">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="name" type="xs:string" />
<xs:element minOccurs="0" name="first-name" type="xs:string" />
<xs:element minOccurs="0" name="last-name" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="price" type="xs:decimal" />
</xs:sequence>
<xs:attribute name="genre" type="xs:string" use="required" />
<xs:attribute name="publicationdate" type="xs:date" use="required" />
<xs:attribute name="ISBN" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
XML 데이터의 강력한 형식 편집이 미치는 영향
클래스는 XPathNavigator 강력한 형식의 XML을 설명하기 위한 기준으로 W3C XML 스키마를 사용합니다. W3C XML 스키마 문서에 대한 유효성 검사에 따라 형식 정보로 요소 및 특성에 주석을 추가할 수 있습니다. 다른 요소나 특성을 포함할 수 있는 요소를 복합 형식이라고 하지만 텍스트 콘텐츠만 포함할 수 있는 요소를 단순 형식이라고 합니다.
비고
특성에는 단순 형식만 있을 수 있습니다.
요소 또는 특성은 해당 형식 정의와 관련된 모든 규칙을 준수하는 경우 스키마가 유효한 것으로 간주될 수 있습니다. 단순 형식 xs:int
이 있는 요소는 스키마가 유효하려면 -2147483648 및 2147483647 사이의 숫자 값을 포함해야 합니다. 복합 형식의 경우 요소의 스키마 유효성은 자식 요소 및 특성의 스키마 유효성에 따라 달라집니다. 따라서 요소가 복합 형식 정의에 대해 유효한 경우 모든 자식 요소와 특성은 해당 형식 정의에 대해 유효합니다. 마찬가지로 요소의 자식 요소 또는 특성 중 하나라도 해당 형식 정의에 대해 유효하지 않거나 알 수 없는 유효성이 있는 경우 요소는 유효하지 않거나 알 수 없는 유효성도 있습니다.
요소의 유효성은 자식 요소와 특성의 유효성에 따라 달라지므로, 수정이 이루어지면 이전에 유효했던 경우에도 요소의 유효성이 변경될 수 있습니다. 특히 요소의 자식 요소 또는 특성이 삽입, 업데이트 또는 삭제되면 요소의 유효성을 알 수 없게 됩니다. 요소의 Validity 속성에서 SchemaInfo 속성이 NotKnown로 설정됩니다. 또한 요소의 부모 요소(및 부모 요소 등)의 유효성도 알 수 없게 되므로 이 효과는 XML 문서 전체에서 재귀적으로 위쪽으로 계단식으로 이동합니다.
스키마 유효성 검사 및 XPathNavigator 클래스에 대한 자세한 내용은 XPathNavigator를 사용한 스키마 유효성 검사를 참조하세요.
특성 수정
SetValue 및 SetTypedValue 메서드를 사용하여 형식화되지 않은 속성 노드와 "노드 수정" 섹션에 나열된 다른 노드 종류를 수정할 수 있습니다.
다음 예제에서는 genre
파일에서 첫 번째 book
요소의 books.xml
속성 값을 변경합니다.
Dim document As XmlDocument = New XmlDocument()
document.Load("books.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()
navigator.MoveToChild("bookstore", String.Empty)
navigator.MoveToChild("book", String.Empty)
navigator.MoveToAttribute("genre", String.Empty)
navigator.SetValue("non-fiction")
navigator.MoveToRoot()
Console.WriteLine(navigator.OuterXml)
XmlDocument document = new XmlDocument();
document.Load("books.xml");
XPathNavigator navigator = document.CreateNavigator();
navigator.MoveToChild("bookstore", String.Empty);
navigator.MoveToChild("book", String.Empty);
navigator.MoveToAttribute("genre", String.Empty);
navigator.SetValue("non-fiction");
navigator.MoveToRoot();
Console.WriteLine(navigator.OuterXml);
SetValue 및 SetTypedValue 메서드에 대한 자세한 내용은 "형식화되지 않은 값 수정" 및 "형식화된 값 수정" 섹션을 참조하세요.
InnerXml 및 OuterXml 속성
클래스의 InnerXml 및 OuterXml 속성은 XPathNavigator 개체가 현재 위치한 노드의 XML 마크업을 변경합니다.
현재 InnerXml 개체가 위치한 자식 노드의 XML 마크업을 지정된 XPathNavigator XML의 구문 분석된 내용으로 변경합니다 string
. 마찬가지로 이 속성은 OuterXml 현재 노드 XPathNavigator 자체뿐만 아니라 개체가 현재 배치된 자식 노드의 XML 태그를 변경합니다.
다음 예제에서는 속성을 사용 하 여 OuterXml 요소의 값을 수정 하 고 파일의 price
첫 번째 discount
요소 book
에 새 contosoBooks.xml
특성을 삽입 합니다.
Dim document As XmlDocument = New XmlDocument()
document.Load("contosoBooks.xml");
Dim navigator As XPathNavigator = document.CreateNavigator()
navigator.MoveToChild("bookstore", "http://www.contoso.com/books")
navigator.MoveToChild("book", "http://www.contoso.com/books")
navigator.MoveToChild("price", "http://www.contoso.com/books")
navigator.OuterXml = "<price discount=\"0\">10.99</price>"
navigator.MoveToRoot()
Console.WriteLine(navigator.OuterXml)
XmlDocument document = new XmlDocument();
document.Load("contosoBooks.xml");
XPathNavigator navigator = document.CreateNavigator();
navigator.MoveToChild("bookstore", "http://www.contoso.com/books");
navigator.MoveToChild("book", "http://www.contoso.com/books");
navigator.MoveToChild("price", "http://www.contoso.com/books");
navigator.OuterXml = "<price discount=\"0\">10.99</price>";
navigator.MoveToRoot();
Console.WriteLine(navigator.OuterXml);
이 예제에서는 파일을 입력으로 사용합니다 contosoBooks.xml
.
<?xml version="1.0" encoding="utf-8" ?>
<bookstore xmlns="http://www.contoso.com/books">
<book genre="autobiography" publicationdate="1981-03-22" ISBN="1-861003-11-0">
<title>The Autobiography of Benjamin Franklin</title>
<author>
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
</author>
<price>8.99</price>
</book>
<book genre="novel" publicationdate="1967-11-17" ISBN="0-201-63361-2">
<title>The Confidence Man</title>
<author>
<first-name>Herman</first-name>
<last-name>Melville</last-name>
</author>
<price>11.99</price>
</book>
<book genre="philosophy" publicationdate="1991-02-15" ISBN="1-861001-57-6">
<title>The Gorgias</title>
<author>
<name>Plato</name>
</author>
<price>9.99</price>
</book>
</bookstore>
네임스페이스 노드 수정
DOM(문서 개체 모델)에서 네임스페이스 선언은 삽입, 업데이트 및 삭제할 수 있는 일반 특성인 것처럼 처리됩니다. 네임스페이 XPathNavigator 스 노드의 값을 변경하면 다음 예제와 같이 네임스페이스 노드 범위 내에서 요소 및 특성의 ID를 변경할 수 있으므로 클래스는 네임스페이스 노드에서 이러한 작업을 허용하지 않습니다.
<root xmlns="http://www.contoso.com">
<child />
</root>
위의 XML 예제가 다음과 같이 변경되면 각 요소의 네임스페이스 URI 값이 변경되므로 문서의 모든 요소 이름이 효과적으로 바뀝니다.
<root xmlns="urn:contoso.com">
<child />
</root>
네임스페이스 노드를 삽입하는 범위에서 네임스페이스 선언과 충돌하지 않는 네임스페이스 노드의 삽입은 XPathNavigator 클래스에서 허용됩니다. 이 경우 네임스페이스 선언은 XML 문서의 하위 범위에서 선언되지 않으며 다음 예제와 같이 이름을 바꾸지 않습니다.
<root xmlns:a="http://www.contoso.com">
<parent>
<a:child />
</parent>
</root>
위의 XML 예제가 다음과 같이 변경되면 네임스페이스 선언이 다른 네임스페이스 선언의 범위 아래 XML 문서에 올바르게 전파됩니다.
<root xmlns:a="http://www.contoso.com">
<parent a:parent-id="1234" xmlns:a="http://www.contoso.com/parent-id">
<a:child xmlns:a="http://www.contoso.com/" />
</parent>
</root>
위의 XML 예제에서 a:parent-id
특성은 parent
네임스페이스의 http://www.contoso.com/parent-id
요소에 삽입됩니다.
CreateAttribute 메서드는 parent
요소에 위치했을 때 속성을 삽입하는 데 사용됩니다.
http://www.contoso.com
네임스페이스 선언은 나머지 XML 문서의 일관성을 XPathNavigator 유지하기 위해 클래스에 의해 자동으로 삽입됩니다.
엔터티 참조 노드 수정
개체의 XmlDocument 엔터티 참조 노드는 읽기 전용이며, XPathNavigator 또는 XmlNode 클래스를 사용하여 편집할 수 없습니다. 엔터티 참조 노드를 수정하려고 시도하면 오류가 발생합니다 InvalidOperationException.
xsi:nil 노드 수정
W3C XML 스키마 권장 사항은 nillable인 요소의 개념을 소개합니다. 요소가 nillable이면 요소에 콘텐츠가 없고 여전히 유효할 수 있습니다. nillable인 요소의 개념은 개체 null
의 개념과 비슷합니다. 가장 큰 차이점은 개체에 null
액세스할 수 없는 반면 xsi:nil
요소에는 액세스할 수 있지만 콘텐츠(자식 요소 또는 텍스트)가 없는 특성과 같은 속성이 여전히 있다는 것입니다. XML 문서의 요소에 값 xsi:nil
이 있는 특성이 있으면 true
요소에 콘텐츠가 없음을 나타내는 데 사용됩니다.
XPathNavigator 개체를 사용하여 xsi:nil
특성이 값이 true
인 유효한 요소에 콘텐츠를 추가하는 경우, 해당 xsi:nil
특성의 값이 false
로 설정됩니다.
비고
xsi:nil
속성이 false
으로 설정된 요소의 내용이 삭제되더라도, 속성 값은 true
로 변경되지 않습니다.
XML 문서 저장
이 항목에 설명된 XmlDocument 편집 방법의 결과로 개체에 대한 변경 내용을 저장하는 작업은 클래스의 XmlDocument 메서드를 사용하여 수행됩니다. 개체의 변경 내용을 XmlDocument 저장하는 방법에 대한 자세한 내용은 문서 저장 및 쓰기를 참조하세요.
참고하십시오
.NET