2010-02-25 6 views
2

노드가 네임 스페이스에 속하면 해당 노드는 기본적으로 동일한 네임 스페이스에 속합니다. 따라서 각 어린이에 xmlns 속성을 제공 할 필요가 없습니다.LINQ to XML : 자식 노드의 중복 네임 스페이스 특성 억제

그러나. 나는이 같은 두 개의 노드를 만들 경우

는 :

Dim parent = <parent xmlns="http://my.namespace.org"/> 
Dim child = <child xmlns="http://my.namespace.org">value</child> 

parent.Add(child) 

Console.WriteLine(parent.ToString) 

결과는 이것이다 :

<parent xmlns="http://my.namespace.org"> 
    <child xmlns="http://my.namespace.org">value</child> 
</parent> 

하지만, 덜 편리한 방식으로 만드는 경우 :

Dim parent = <parent xmlns="http://my.namespace.org"/> 
Dim child As New XElement(XName.Get("child", "http://my.namespace.org")) With {.Value = "value"} 

parent.Add(child) 

Console.WriteLine(parent.ToString) 

결과가 더 바람직합니다.

<parent xmlns="http://my.namespace.org"> 
    <child>value</child> 
</parent> 

분명히 훨씬 직관적이고 쉽게 코딩 할 수 있기 때문에 첫 번째 방법을 사용하는 것을 선호합니다. 방법 2를 사용하지 않는 또 다른 이유가 있습니다. XElement.Parse으로 노드를 만들고, xmlns 속성을 포함하는 문자열을 파싱해야하는데, 방법 1과 완전히 동일한 결과를 생성합니다.

그래서 어떻게해야합니까? 방법 2의 예쁜 결과물을 얻었고, 방법 1처럼 노드를 만들었습니까? 내가 볼 수있는 유일한 옵션은 주어진 XElement를 복제하는 메소드를 만드는 것이며, 메소드 2 패턴에 따라 효과적으로 재 작성하지만 추한 것 같습니다. 나는 어떤 이유로 간과 한 좀 더 명백한 해결책을 찾고있다.

+0

@GSerg : 아래 답변이 귀하의 질문에 대한 답변입니까? –

답변

1

어 ... 네임 스페이스 - 그들은 나를 죽음으로 만듭니다. 여기

당신이 이동 :

Dim ns As XNamespace = "http://my.namespace.org" 
Dim parent = <<%= ns + "parent" %>/> 
Dim child = <<%= ns + "child" %>>value</> 
parent.Add(child) 

XElement.Parse을 사용하고 부모 노드의 네임 스페이스와 동기화 자식 노드를 유지 할 수 있으려면, 그것은 글로벌 네임 스페이스를 사용하는 것이 가장 좋습니다. VB.NET에서 정말 쉽습니다. 모듈/클래스의 맨 위에서 Imports를 사용하면 모든 부모와 자식이이 네임 스페이스를 사용합니다. <child/> 요소가 처음 생성되는

Imports <xmlns="http://my.namespace.org"> 
Module Main 
    Sub SomeSub() 
     Dim child = <child>value</child> 
     Dim parent = <parent><%= child %></parent> 
     Console.WriteLine(parent.ToString) 
    End Sub 
End Module 

참고 : 예를 들어. 동일한 기본이 아닌 네임 스페이스 (예 : Imports <xmlns:p="http://parent.namespace.org">)에 적용한 다음 <p:child/><p:parent/>을 사용하여 만듭니다.

한 번 읽었지만 다시 찾지 못했습니다. XML 리터럴을 내가 모르는 사이에 - 그게 뭐니 뭐니해도 - parent.Add(something) - 잘못된 생각입니다.

+0

대단한 트릭입니다! 리터럴에서는 다소 지저분하지만 출력은 더 깨끗합니다. – CoderDennis

+0

트릭은 실제로 좋지만 문제를 부분적으로 만 해결합니다. 구문 분석 할 XML 문자열이있는 경우 출력에는 자식 노드의 네임 스페이스가 포함됩니다. 그래서 노드를 만드는 특수한 방법보다는 이미 구성된 노드에 대해 이러한 플래그를 설정하는 방법을 찾고있었습니다. 때로는 특별한 방법을 사용할 수 없기 때문입니다. 그러나 다른 해결책이없는 경우이 대답을 기꺼이 받아들입니다. – GSerg

+0

@GSerg : 아, 이제 시작했습니다. 나는 당신을 위해 일할 희망으로 대답을 업데이트했습니다. –