2011-02-13 13 views
63

:XElement ad (Nasıl?) Gibi düğüm öneki ile xml belgesi nasıl oluşturulur

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

Ben new XElement("sphinx:docset") i istisna

İşlenmeyen özel durum alma gibi bir şey çalıştırmayı denediğinizde : System.Xml.XmlException: ':' karakteri, onaltılık 0xEA, bir adda yer alamaz. System.Xml.Linq.XName..ctor de System.Xml.XmlConvert.VerifyNCName de (String adı, ExceptionType exceptionTyp e) (XNamespace ns Yaylı localName) System.Xml.Linq.XNamespace.GetName de (String System.Xml.Linq.XName.Get at localName) (Dize expandedName)

yardım için teşekkür ederiz !;)

+0

'XmlNamespaceManager' sınıfına bir göz atın. –

+2

Belgeniz geçersizdi. Sfenks önekini bildirmesi gerekiyor. –

cevap

98

Bu XML LINQ gerçekten kolaydır:

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

Ya t yapmak O düzgün "takma" iş sizin örnekler gibi görünmesi için, böyle bir şey:

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")))); 

üretir Yani:

<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> 
+0

teşekkürler, ama ilk sürümü için istediğim şey değil;))) – Edward83

+0

@ Edward83: Diğer örneğime bakın. Temelde bir yerde xmlns içinde belirtilecek ad alanına ihtiyacınız olacak ... –

+0

Tüm çirkin hacklerden sonra bunu yapmak için kullandım (adlara her şeyi eklemek için yinelemeli statik yöntemler) ... Bu yaklaşımı ilk olarak denedim, fakat ben XNamespace.Xmlns dış ad alanına önek vermedi. Bu önek neden gerekli? Global için mi ayarladı? – micahhoover

17

Sen belgenin ad okumak ve böyle sorguları kullanabilirsiniz :

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

Güzel yaklaşım (+1)! Ancak, bu kök XML öğesinin birden çok xmlns özniteliğine sahip olduğu bir durumda benim için çalışmadı, yani: xmlns: soapenv = "..." xmlns = "...". Xml.Root.GetDefaultNamespace() yöntemini kullanmak istediğimi aldım, bu da xmlns = "..." özniteliğinin değeriydi. –

İlgili konular