developer tip

XElement 네임 스페이스 (방법?)

copycodes 2020. 11. 1. 18:14
반응형

XElement 네임 스페이스 (방법?)


다음과 같은 노드 접두사를 사용하여 xml 문서를 만드는 방법 :

<sphinx:docset>
  <sphinx:schema>
    <sphinx:field name="subject"/>
    <sphinx:field name="content"/>
    <sphinx:attr name="published" type="timestamp"/>
 </sphinx:schema>

new XElement("sphinx:docset")예외가 발생하는 것처럼 실행하려고 할 때

처리되지 않은 예외 : System.Xml.XmlException : ':'문자, 16 진수 값 0x3A는 이름에 포함될 수 없습니다.
System.Xml.XmlConvert.VerifyNCName (String name, ExceptionType exceptionTyp e)
at System.Xml.Linq.XName..ctor (XNamespace ns, String localName)
at System.Xml.Linq.XNamespace.GetName (String localName)
at System .Xml.Linq.XName.Get (문자열 확장 이름)


LINQ to XML에서는 정말 쉽습니다.

XNamespace ns = "sphinx";
XElement element = new XElement(ns + "docset");

또는 "별칭"이 제대로 작동하여 예제처럼 보이게하려면 다음과 같이하십시오.

XNamespace ns = "http://url/for/sphinx";
XElement element = new XElement("container",
    new XAttribute(XNamespace.Xmlns + "sphinx", ns),
    new XElement(ns + "docset",
        new XElement(ns + "schema"),
            new XElement(ns + "field", new XAttribute("name", "subject")),
            new XElement(ns + "field", new XAttribute("name", "content")),
            new XElement(ns + "attr", 
                         new XAttribute("name", "published"),
                         new XAttribute("type", "timestamp"))));

그 결과 :

<container xmlns:sphinx="http://url/for/sphinx">
  <sphinx:docset>
    <sphinx:schema />
    <sphinx:field name="subject" />
    <sphinx:field name="content" />
    <sphinx:attr name="published" type="timestamp" />
  </sphinx:docset>
</container>

문서의 네임 스페이스를 읽고 다음과 같은 쿼리에서 사용할 수 있습니다.

XDocument xml = XDocument.Load(address);
XNamespace ns = xml.Root.Name.Namespace;
foreach (XElement el in xml.Descendants(ns + "whateverYourElementNameIs"))
    //do stuff

참고 URL : https://stackoverflow.com/questions/4985974/xelement-namespaces-how-to

반응형