2008-09-30 14 views
6

मैं एक्सएमएल नौसिखिया के लिए LINQ और एक केएमएल नौसिखिया भी हूं; तो मेरे साथ सहन करो।केएमएल के लिए एक्सएमएल लिंक?

मेरा लक्ष्य एक केएमएल फ़ाइल से अलग-अलग प्लेसमार्क निकालना है। मेरे एम एल thusly शुरू होता है:

<?xml version="1.0" encoding="utf-8"?> 
<Document xmlns="http://earth.google.com/kml/2.0"> 
    <name>Concessions</name> 
    <visibility>1</visibility> 
    <Folder> 
    <visibility>1</visibility> 
    <Placemark> 
     <name>IN920211</name> 
     <Style> 
     <PolyStyle> 
      <color>80000000</color> 
     </PolyStyle> 
     </Style> 
     <Polygon> 
     <altitudeMode>relativeToGround</altitudeMode> 
     <outerBoundaryIs> 
      <LinearRing> 
      <coordinates>11.728374,1.976421,0 11.732967,1.965322,0 11.737225,1.953161,0 11.635858,1.940812,0 11.658102,1.976874,0 11.728374,1.976421,0 </coordinates> 
      </LinearRing> 
     </outerBoundaryIs> 
     </Polygon> 
    </Placemark> 
    <Placemark> 
    ... 

यह जहाँ तक मैं मिल गया है है:

Dim Kml As XDocument = XDocument.Load(Server.MapPath("../kmlimport/ga.kml")) 
    Dim Placemarks = From Placemark In Kml.Descendants("Placemark") _ 
     Select Name = Placemark.Element("Name").Value 

अब तक अच्छा नहीं - Kml.Descendants ("स्थान-चिह्न") मुझे एक खाली गणन देता है। दस्तावेज़ ठीक से लोड किया गया है - क्योंकि KML.Descendants में प्रत्येक नोड होता है। इन प्रश्नों के लायक होने के लिए यह भी खाली है:

Dim foo = Kml.Descendants("Document") 
Dim foo = Kml.Descendants("Folder") 

क्या कोई मुझे सही दिशा में इंगित कर सकता है? एक्सएमएल ट्यूटोरियल के लिए अच्छे लिंक से लिंक के लिए बोनस पॉइंट्स - जिन्हें मैंने ऑनलाइन पाया है, वे बहुत ही सरल परिदृश्यों पर रुकते हैं।

उत्तर

1

सही दिशा में मुझे इंगित करने के लिए spoon16 और ब्रूस मर्डॉक के लिए धन्यवाद। कोड जो spoon16 पोस्ट करता है काम करता है, लेकिन आपको प्रत्येक तत्व नाम के साथ नेमस्पेस को संयोजित करने के लिए मजबूर करता है, जो मुझे पसंद नहीं है।

मैंने थोड़ा और खोज किया है और मुझे पता चला है कि यह कैसे किया जाना चाहिए - यह बहुत संक्षिप्त है, और मुझे एक्सएमएल तत्वों का जिक्र करने के लिए नया < ...> ब्रैकेट सिंटैक्स पसंद है।

Imports <xmlns:g='http://earth.google.com/kml/2.0'> 
Imports System.Xml.Linq 

... 

    Dim Kml As XDocument = XDocument.Load(Server.MapPath("../kmlimport/ga.kml")) 
    For Each Placemark As XElement In Kml.<g:Document>.<g:Folder>.<g:Placemark> 
     Dim Name As String = Placemark.<g:name>.Value 
    Next 

नोट : जी पहली पंक्ति में xmlns निम्नलिखित। यह आपको इस नामस्थान को कहीं और संदर्भित करने के लिए एक शॉर्टकट देता है।

XNamespace क्लास के बारे में अधिक जानकारी के लिए, MSDN documentation देखें।

0

आप XElement नाम

Dim ns as string = "http://earth.google.com/kml/2.0" 
dim foo = Kml.Descendants(ns + "Document") 

किसी भी वाक्यविन्यास त्रुटियों पर ध्यान न दें करने के लिए एक नाम स्थान जोड़ने पड़ सकते हैं, मैं सी # में काम

आप पाएंगे बनाम XElement.Name.LocalName/

XElement.Name में अंतर हो सकता है

मैं आमतौर पर दस्तावेज़ में सभी XElements के माध्यम से दस्तावेज़ में सही नामकरण का उपयोग कर रहा हूं यह सुनिश्चित करने के लिए पहले चरण के रूप में।

सी # यहाँ, मेरी उपयोग के एक अंश है लगता है कि मैं भूल गया {}

private string GpNamespace = 
"{http://schemas.microsoft.com/GroupPolicy/2006/07/PolicyDefinitions}"; 

var results = admldoc.Descendants(GpNamespace + 
       "presentationTable").Descendants().Select(
       p => new dcPolicyPresentation(p)); 
+0

यह मैं देता रन-समय अपवाद: System.Xml.XmlException - ':' चरित्र, हेक्साडेसिमल मान 0x3A, में शामिल नहीं किया जा सकता है एक नाम। –

+0

सी # में जवाब देने के लिए स्वतंत्र महसूस करें। –

+0

धन्यवाद - यह काम करता है। मुझे एक और संक्षिप्त दृष्टिकोण मिला है जिसे मैं नीचे पोस्ट करूंगा। –

0

ऊपर सुधारों की न तो काम किया है; विवरण के लिए मेरी टिप्पणियां देखें। मेरा मानना ​​है कि चम्मच 16 और ब्रूस मर्डॉक दोनों सही रास्ते पर हैं, क्योंकि नेमस्पेस निश्चित रूप से मुद्दा है।

आगे बढ़ने के बाद मैं this page पर कुछ कोड आया, जिसने वर्कअराउंड का सुझाव दिया: बस मूल XML से xmlns विशेषता को पट्टी करें।

' Read raw XML 
    Dim RawXml As String = ReadFile("../kmlimport/ga.kml") 
    ' HACK: Linq to XML choking on the namespace, just get rid of it 
    RawXml = RawXml.Replace("xmlns=""http://earth.google.com/kml/2.0""", "") 
    ' Parse XML 
    Dim Kml As XDocument = XDocument.Parse(RawXml) 
    ' Loop through placemarks 
    Dim Placemarks = From Placemark In Kml.<Document>.<Folder>.Descendants("Placemark") 
    For Each Placemark As XElement In Placemarks 
     Dim Name As String = Placemark.<name>.Value 
     ... 
    Next 

यदि कोई भी कामकाजी कोड पोस्ट कर सकता है जो नामकरण के बजाय नामस्थान के साथ काम करता है, तो मैं खुशी से उन्हें जवाब दूंगा।

1

स्कॉट हैनसेलमैन के पास सी # आधारित समाधान की तलाश करने वालों के लिए एक संक्षिप्त समाधान है।

XLINQ to XML support in VB9

इसके अलावा, XNamespace का उपयोग कर काम में, बल्कि सिर्फ एक स्ट्रिंग जोड़कर से आता है। यह थोड़ा और औपचारिक है।

// This code should get all Placemarks from a KML file    
var xdoc = XDocument.Parse(kmlContent); 
XNamespace ns = XNamespace.Get("http://earth.google.com/kml/2.0"); 
var ele = xdoc.Element(ns + "kml").Element(ns + "Document").Elements(ns + "Placemark"); 
5

यह सी # में मेरे लिए काम करता है:

XDocument doc = XDocument.Load(@"TheFile.kml"); 

var q = doc.Descendants().Where(x => x.Name.LocalName == "Placemark"); 
संबंधित मुद्दे