2014-03-30 2 views
1

네임 스페이스 접두사와 관련하여 특정 패턴을 따르는 코드 (LINQ to XML)를 통해 XML을 생성하려고합니다. 나는이 XML 네임 스페이스로 구성되는 다음과 같은 출력 생성 할 (사건을 설명하는 예를 들어, 속성의 순서 무관) :XElement (C#)의 중복 네임 스페이스

<name1 xmlns:space2="urn:schemas-upnp-org:namespace2/" xmlns="urn:schemas-upnp-org:namespace1/" name2="foo" space2:name4="demo"> 
    <name3>bar</name3> 
</name1> 

그것은 필수적이다 namespace1 기본 네임 스페이스 (국번없이) 인 것을 및 namespace2에는 "space2"라는 접두사가 있습니다 (나도 알고 있지만 저를 비난하지 않습니다 - 그런 것들을 요구하는 표준이 있습니다).

나는 C#에서 많은 다른 접근법을 시도했다. 내가 생각할 가장 가능성은 다음과 같습니다.

public static readonly XNamespace NS1 = "urn:schemas-upnp-org:namespace1/"; 
public static readonly XNamespace NS2 = "urn:schemas-upnp-org:namespace2/"; 

public static readonly XName Name1 = NS1 + "name1"; 
public static readonly XName Name2 = NS1 + "name2"; 
public static readonly XName Name3 = NS1 + "name3"; 
public static readonly XName Name4 = NS2 + "name4"; // in namespace 2 

void Test() { 
    var y = new XElement(Name1, 
      new XAttribute(XNamespace.Xmlns + "space2", NS2.NamespaceName), 
      new XAttribute(Name2, "foo"), 
      new XAttribute(Name4, "demo"), 
      new XElement(Name3, "bar")); 
    Trace.WriteLine(y.ToString()); 
} 

그러나 어떤 이유로 든 잘못되었습니다. namespace1의 일부 요소에는 "p1"의 별난 접두사가 할당됩니다. 그들은 같은 네임 스페이스 참조를 사용하더라도, LINQ는 이름 1 및 NAME2가 다른 의 네임 스페이스를 생각한다는 것, 그리고 두 번 선언

<name1 xmlns:space2="urn:schemas-upnp-org:namespace2/" p1:name2="foo" space2:name4="demo" xmlns:p1="urn:schemas-upnp-org:namespace1/" xmlns="urn:schemas-upnp-org:namespace1/"> 
    <p1:name3>bar</p1:name3> 
</name1> 

문제는 내가를 할당하면 발생하지 않는 것 접두사 namespace1으로 또는 namespace2에서 속성을 제거했지만 문제가 도움이되지 않으므로 도움이되지 않습니다.

그래서 질문의 본질은 다음과 같습니다. LINQ가 XML에서 NS1에 두 개의 다른 네임 스페이스 선언을 할당하는 이유는 무엇입니까? 항상 기본 네임 스페이스에 매핑되도록 구성 할 수 있습니까?

답변

0

기본 네임 스페이스에 대한 두 번째 매핑을 만드는 "foo"특성에 네임 스페이스를 지정하고 있습니다. 결과적으로 2 개의 유효한 매핑이 있으며 노드 중 하나 (최신 가능성이 높음)를 선택할 수 있습니다.

속성은 명시적인 접두사가 없으면 빈 네임 스페이스에 있으므로 실제로 코드가 다른 XML을 생성하므로 속성 이름은 {}foo 대신 {urn:schemas-upnp-org:namespace2/}foo입니다.

수정 : 나는 이것에 대해 알고하지 않았다 "foo는"

public static readonly XName Name2 = "name2"; 
+0

에 대한 네임 스페이스를 지정하지 마십시오. 실제로 많은 XML 스키마 디자이너가 속성이 모두 부적합하다고 판단한 것으로 보입니다. 즉, _attributes_에서 네임 스페이스를 제거하면 문제가 해결됩니다. 감사! – micTronic