2009-08-20 6 views
0

내 이름은 동일한 이름이지만 다른 네임 스페이스를 갖는 두 개의 속성으로 값을 설정하는 방법입니다.명시 적 및 암시 적 XML 이름 공간

XML 문서에서 C#을 사용하면 요소에 두 개의 특성을 할당해야합니다. 그것은

문서의 XMLNS과 같아야합니다 XMI = "uriaddress" 요소 XSI : 유형 = "xsitype1"유형 = "타입 1"나는

xElement.SetAttribute ("유형"을 시도

을, "uriaddress", "xsitype1")

이 작동합니다.

그러나, 놀랍게도은 그 또한 그것을

xElement.SetAttribute ("유형", "타입 1")

이 작품에 의해, 두 번째 속성, "유형"을 설정할 수 있지만하려고 할 때 xmi : type 속성을 "type"속성과 동일한 값으로 재설정하여 의도하지 않은 방식으로 요소를 변경합니다.

이제 요소는

요소 XSI과 같습니다 유형 = "타입 1"유형 = "타입 1"

이 문제를 해결받을 수있는 방법?

답변

0

첫 번째 SetAttribute 호출에서 잘못된 네임 스페이스를 넣는 것처럼 보입니다. 당신은 단지 문제를 보여주기 위해 시도 할 수있다

그 네임 스페이스는 ...하지 XMI 접두사에 대한 XSI 접두사에 대한 네임 스페이스,해야한다, 그래서 나는

을하는 데 도움이 여기에 잘못 생각

희망을 얻었을 수도

+0

감사합니다. 당신은 내 그림에 문제가 있다는 글을 썼습니다. 문서의 네임 스페이스는 실제로 xmlns : xsi = "uriaddress" 이므로 불행히도 여전히 문제가 남아 있습니다. –

2

이 코드 :

<element xmlns:xsi="uriaddress" type="foo" xsi:type="bar" /> 

<element xmlns:xsi="uriaddress" type="baz" xsi:type="bar" /> 

<element xmlns:xsi="uriaddress" type="baz" xsi:type="bat" /> 
:

XDocument d = new XDocument(); 
    XNamespace xsi = "uriaddress"; 
    d.Add(
     new XElement(
      "element", 
      new XAttribute(XNamespace.Xmlns + "xsi", "uriaddress"), 
      new XAttribute("type", "foo"), 
      new XAttribute(xsi + "type", "bar"))); 
    using (XmlWriter xw = XmlWriter.Create(Console.Out)) 
    { 
     d.WriteTo(xw); 
    } 

    d.Element("element").SetAttributeValue("type", "baz"); 
    using (XmlWriter xw = XmlWriter.Create(Console.Out)) 
    { 
     d.WriteTo(xw); 
    } 

    d.Element("element").SetAttributeValue(xsi + "type", "bar");   
    using (XmlWriter xw = XmlWriter.Create(Console.Out)) 
    { 
     d.WriteTo(xw); 
    } 

이 출력 (공백 추가 및 XML 선언이 읽기 쉽도록 제거) 생산

당신이 (원래의 게시물에서 말할 하드) XDocument을 사용하지 않는 경우는,이 ​​코드는 기본적으로 동일한 결과를 생성 : 대답하려는 시도에 대한

XmlDocument d = new XmlDocument(); 
    d.LoadXml("<element xmlns:xsi='uriaddress' type='foo' xsi:type='bar'/>"); 
    Console.WriteLine(d.OuterXml); 

    d.DocumentElement.SetAttribute("type", "baz"); 
    Console.WriteLine(d.OuterXml); 

    d.DocumentElement.SetAttribute("type", "uriaddress", "bat"); 
    Console.WriteLine(d.OuterXml); 
+0

로버트, 도움을 주셔서 감사합니다. 나는 조금 다르게하고 괜찮 았어. 기본적으로 SetAttribute를 직접 사용하는 대신, 먼저 속성을 별도의 객체로 만든 다음 속성 목록에 추가했습니다. 게시 한 코드에서 아이디어를 얻었습니다. 다시 한 번 감사드립니다. 마이크 –

관련 문제