2010-01-22 4 views
7

हमें एक विक्रेता से एक एक्सएमएल दस्तावेज़ मिल रहा है जिसे हमें अपने स्टाइलशीट का उपयोग करने पर एक्सएसएल ट्रांसफॉर्म करने की आवश्यकता है ताकि हम परिणामी एचटीएमएल को पीडीएफ में परिवर्तित कर सकें। वास्तविक स्टाइलशीट को XML दस्तावेज़ में ?xml-stylesheet परिभाषा के href विशेषता में संदर्भित किया गया है। क्या कोई तरीका है कि मैं उस यूआरएल को सी # का उपयोग कर प्राप्त कर सकता हूं? मुझे विक्रेता पर भरोसा नहीं है कि यूआरएल को न बदलें और स्पष्ट रूप से इसे हार्डकोड नहीं करना चाहते हैं।मैं <? Xml-styleheet> नोड से href विशेषता मान कैसे प्राप्त कर सकता हूं?

पूर्ण ?xml-stylesheet तत्व के साथ एक्सएमएल फ़ाइल के शुरू होने से इस तरह दिखता है:

XDocument xDoc = ...; 

var cssUrlQuery = from node in xDoc.Nodes() 
     where node.NodeType == XmlNodeType.ProcessingInstruction 
     select Regex.Match(((XProcessingInstruction)node).Data, "href=\"(?<url>.*?)\"").Groups["url"].Value; 

या LINQ वस्तुओं के लिए

var cssUrls = (from XmlNode childNode in doc.ChildNodes 
        where childNode.NodeType == XmlNodeType.ProcessingInstruction && childNode.Name == "xml-stylesheet" 
        select (XmlProcessingInstruction) childNode 
        into procNode select Regex.Match(procNode.Data, "href=\"(?<url>.*?)\"").Groups["url"].Value).ToList(); 

xDoc:

<?xml version="1.0" encoding="utf-8"?> 
<?xml-stylesheet type="text/xsl" href="http://www.fakeurl.com/StyleSheet.xsl"?> 

उत्तर

2

Linq एक्सएमएल कोड के लिए .XPathSelectElement() काम नहीं करेगा क्योंकि कुछ रीसास के लिए XElement को XProcessin में नहीं डाला जा सकता gInstruction।


using(var xr = XmlReader.Create(input)) 
{ 
    while(xr.Read()) 
    { 
     if(xr.NodeType == XmlNodeType.ProcessingInstruction && xr.Name == "xml-stylesheet") 
     { 
      string s = xr.Value; 
      int i = s.IndexOf("href=\"") + 6; 
      s = s.Substring(i, s.IndexOf('\"', i) - i); 
      Console.WriteLine(s); 
      break; 
     } 
    } 
} 
+0

मैं डोम या लिंककॉक्सएमएल का उपयोग करना पसंद करूंगा, लेकिन जितना अधिक मैं इसे खो देता हूं उतना ही ऐसा लगता है कि यह एकमात्र विकल्प हो सकता है। –

+0

हाँ, मैं भी इसके साथ संघर्ष कर रहा हूं। अगर कोई तरीका था तो मैं प्रोटीन इंस्ट्रक्शन को एलीमेंट की तरह व्यवहार कर सकता था, यह आसान होगा। –

1

मूल्य एक उचित XML पार्सर का उपयोग कर आप कुछ इस तरह लिख सकते हैं खोजने के लिए। आपके स्रोत के साथ लोड किए गए एक्सएमएल डॉक्यूमेंट को देखते हुए:

XmlProcessingInstruction instruction = doc.SelectSingleNode("//processing-instruction(\"xml-stylesheet\")") as XmlProcessingInstruction; 
if (instruction != null) { 
    Console.WriteLine(instruction.InnerText); 
} 

फिर रेगेक्स के साथ इनरटेक्स्ट को पार्स करें।

3

तुम भी XPath का उपयोग कर सकते हैं:

+2

इस XPATH अभिव्यक्ति का उपयोग करके और आपको कोई रेगेक्स करने की आवश्यकता नहीं है: 'अनुवाद (सबस्ट्रिंग-निर्देश (प्रसंस्करण-निर्देश (' xml-styleheet '),' href = '),' " ',' '' –

3

एक प्रसंस्करण निर्देश के रूप में किसी भी सामग्री में औपचारिक रूप से कोई विशेषता नहीं है। लेकिन अगर आपको पता है कि "छद्म" विशेषताएं हैं, जैसे कि xml-styleheet प्रसंस्करण निर्देश के मामले में, तो आप निश्चित रूप से एक तत्व के मार्कअप को बनाने के लिए प्रसंस्करण निर्देश के मान का उपयोग कर सकते हैं और XML पार्सर के साथ पार्स कर सकते हैं :

XmlDocument doc = new XmlDocument(); 
    doc.Load(@"file.xml"); 
    XmlNode pi = doc.SelectSingleNode("processing-instruction('xml-stylesheet')"); 
    if (pi != null) 
    { 
     XmlElement piEl = (XmlElement)doc.ReadNode(XmlReader.Create(new StringReader("<pi " + pi.Value + "/>"))); 
     string href = piEl.GetAttribute("href"); 
     Console.WriteLine(href); 
    } 
    else 
    { 
     Console.WriteLine("No pi found."); 
    } 
1
private string _GetTemplateUrl(XDocument formXmlData) 
{ 
    var infopathInstruction = (XProcessingInstruction)formXmlData.Nodes().First(node => node.NodeType == XmlNodeType.ProcessingInstruction && ((XProcessingInstruction)node).Target == "mso-infoPathSolution"); 
    var instructionValueAsDoc = XDocument.Parse("<n " + infopathInstruction.Data + " />"); 
    return instructionValueAsDoc.Root.Attribute("href").Value; 
} 
+0

वन 'mso-infoPathSolution' के बजाय' xml-styleheet' का उपयोग करना है, लेकिन फिर यह मेरे लिए काम करता है। यह पहला तत्व लेता है और परिणाम देता है। – testing

0

XmlProcessingInstruction स्टाइलशीट = doc.SelectSingleNode ("प्रसंस्करण-निर्देश ('एक्सएमएल-स्टाइलशीट')") XmlProcessingInstruction के रूप में;