2012-04-15 51 views
4

我需要從經典asp的svg文件中獲取一個屬性。但我的代碼不起作用。任何想法?用asp解析一個svg xml

來自字體標籤的id屬性。

<font id="LetterGothicStdRegular" horiz-adv-x="1228" > 

ASP功能

function getFontId(url) 
Set objXml = Server.CreateObject("MSXML2.DomDocument.6.0") 
'objXml.async = False 
objXml.LoadXML(url) 

For Each oNode In objXml.SelectNodes("svg/defs/font") 
    sKey = oNode.GetAttribute("id") 
' sValue = oNode.Text 
    getXML=sKey 
Next 

Set objXml= Nothing 
end function 

SVG代碼:

<?xml version="1.0" standalone="no"?> 
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 
<svg xmlns="http://www.w3.org/2000/svg"> 
    <metadata>This is a custom SVG webfont generated by Font Squirrel.  Copyright : 1987 1990 1991 1995 1998 2001 2002 Adobe Systems Incorporated All rights reserved  Foundry  : Adobe </metadata> 
    <defs> 
     <font id="LetterGothicStdRegular" horiz-adv-x="1228"> 
      <font-face units-per-em="2048" ascent="1520" descent="-528"/> 
      <missing-glyph horiz-adv-x="500"/> 
      <glyph unicode="2" horiz-adv-x="1783" d="M149 1099l66 51l672 -696l671 696l66 -51l-737 -776z"/> 
      <glyph unicode="8" horiz-adv-x="1783" d="M167 430l737 776l738 -776l-66 -51l-672 696l-671 -696z"/> 
      <glyph unicode="&#x3c;" d="M201 737l776 738l51 -66l-696 -672l696 -671l-51 -66z"/> 
      <glyph unicode="&#x3e;" d="M288 66l696 671l-696 672l51 66l776 -738l-776 -737z"/> 
      <glyph unicode="&#x2000;" horiz-adv-x="737"/> 
      <glyph unicode="&#x2001;" horiz-adv-x="1475"/> 
      <glyph unicode="&#x2002;" horiz-adv-x="737"/> 
      <glyph unicode="&#x2003;" horiz-adv-x="1475"/> 
      <glyph unicode="&#x2004;" horiz-adv-x="491"/> 
      <glyph unicode="&#x2005;" horiz-adv-x="368"/> 
      <glyph unicode="&#x2006;" horiz-adv-x="245"/> 
      <glyph unicode="&#x2007;" horiz-adv-x="245"/> 
      <glyph unicode="&#x2008;" horiz-adv-x="184"/> 
      <glyph unicode="&#x2009;" horiz-adv-x="295"/> 
      <glyph unicode="&#x200a;" horiz-adv-x="81"/> 
      <glyph unicode="&#x202f;" horiz-adv-x="295"/> 
      <glyph unicode="&#x205f;" horiz-adv-x="368"/> 
      <glyph unicode="&#xe000;" horiz-adv-x="500" d="M0 0v0v0v0v0z"/> 
     </font> 
    </defs> 
</svg> 
+0

「我的代碼不工作」 - 具體是什麼與它的問題呢?你有錯誤嗎? – halfer 2012-04-16 19:10:19

回答

5

您可以解析指定svg選擇命名空間。
另外,參數名稱是url,這是否有意義,如果它是一個網址?因爲loadXML僅從包含xml的字符串加載。如果url是遠程的,您應該使用加載並將設置ServerHTTPRequest屬性設置爲True。 檢出validateOnParseresolveExternals。這裏有一個例子:

Function getFontId(url) 
    With Server.CreateObject("MSXML2.DomDocument.6.0") 
     .async = False 
     .validateOnParse = False 'parse only for well-formed xml, no more 
     .resolveExternals = False 
     .setProperty "ServerHTTPRequest", True 
     .setProperty "ProhibitDTD", False ' it's true by default in 6.0 
     If .Load(url) Then 
      .setProperty "SelectionNamespaces", "xmlns:svg='http://www.w3.org/2000/svg'" 
      Dim domAttrId 
      Set domAttrId = .selectSingleNode("//svg:defs/svg:font/@id") 
      If domAttrId Is Nothing Then 
       'node nor attribute not exists 
      Else 
       getFontId = domAttrId.Value 
      End If 
     Else 
      With .parseError 
       Err.Raise .errorCode, .srcText, .reason 
      End With 
     End If 
    End With 
End Function 
+2

+1,但我會建議堅持與6.0不是4.0。 – AnthonyWJones 2012-04-16 12:02:04

+1

@AnthonyWJones是的,你是對的。我更新了答案。謝謝。 – 2012-04-16 12:22:35

+0

謝謝Kul-Tigin! – 2012-04-16 21:51:34

0

你可以嘗試這樣的事情,下面您.LoadXML()語句? (未經測試):

Dim root, xpath, xmlnode, font 
Set root = objXml.documentElement 
    xpath = "/defs/font" 
    set xmlNode = xml.selectNodes(xpath) 
     font = xmlNode(0).getAttribute("id") 
    set xmlNode = Nothing 
Set root = Nothing 

有我注意到幾件事情:

  • 你沒有根集(你可以嘗試設置它,它response.writing ,看它是否返回SVG節點)
  • 的xmlNode(0)返回所述第一節點 它發現,這可能是nessecary

嘗試response.writing使用.xml或.xmltex不同節點看看你是否在DOM樹的正確部分。