2013-11-24 13 views
1

我需要執行以下操作: 將包含SVG(可縮放矢量圖形)的XML文檔解析爲某些元素。 SVG本身就是XML。 但我需要提取SVG部分作爲一個整體,而不需要解析SVG字符串的內容。從XML中提取SVG。選擇哪種Java XML API?

例子:

... 
<symbol> 
    <svg> [arbitrary svg/xml content here ...] </svg> 
</symbol> 
... 

我想解析文檔並提取符號標籤之間的字符串。

我對Java XML API不是很熟悉。 你會推薦哪一個任務? DOM,SAX,StAX? 而一些配方會被折衷。 我瞭解每個之間的差異,不需要解釋基礎知識。 但似乎沒有完美的任務,因爲我需要獲得XML字符串。

+0

你已經試過了什麼?我認爲XML API取決於解析的xml大小。你也可以試試Jsoup - HTML解析器。它也可以解析XML,易於使用。 –

+1

我無法真正理解在此擱置的原因。下面提出的答案是那種能夠幫助我很多的答案,那麼爲什麼要禁止更多有用的答案呢?我可以理解,這裏的答案可能是基於意見的,但這正是我想要的:關於如何在特定背景下解決任務的不同的,有爭議的觀點。請注意,我並不是一般要求「最好的」XML API,而是最適合於提取XML子文檔的任務,這不是那麼簡單的imho。 – Scrontch

回答

1

正如@Georgy所說,決定是否使用DOM,SAX或StAX取決於您的XML大小。大多數情況下,使用DOM解析器將會非常簡單,也適用於大多數中小型XML文檔。假設你的文檔結構是:

<?xml version="1.0" encoding="UTF-8"?> 
<rootElement> 
    <someElement> 
     <symbol> 
      <svg>[arbitrary svg/xml content here ...]</svg> 
     </symbol> 
    </someElement> 
</rootElement> 

那麼你可以使用DOM和XPath API類似這樣的查詢您的文檔:

// Parsing XML document 
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
dbFactory.setIgnoringElementContentWhitespace(true); 
dbFactory.setNamespaceAware(true); 
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
byte[] xmlDATA = yourXMLAsString.getBytes(); 
ByteArrayInputStream in = new ByteArrayInputStream(xmlDATA); 
Document doc = dBuilder.parse(in); 

// Accessing SVG element using XPath 
XPathFactory factory = XPathFactory.newInstance(); 
XPath xpath = factory.newXPath(); 
String xpathQuery = "/rootElement/someElement/symbol/svg"; 
XPathExpression expr = xpath.compile(xpathQuery); 
Node svgNode = (Node) expr.evaluate(doc, XPathConstants.NODE); 

如果您要訪問的SVG內容爲純文本,您可以使用getTextContent()方法檢索節點:

String svgContent = svgNode.getTextContent(); 
+0

謝謝,這是我所期望的那種答案。我試過你的解決方案,但不幸的是,expr.evaluate返回一個空節點,我無法弄清楚爲什麼。我的代碼有點冗長,所以我不會在這裏發佈,但我很高興如果我可以發送給你來審查它。我不知道這是否可能,因爲我沒有找到你的電子郵件地址(這可能是出於安全原因而有意爲之)。 – Scrontch

+0

你可以發佈你的完整的XML文檔(或至少它的模式)嗎?頭號嫌疑犯是您的XPath表達式。它可能引用文檔中的無效地址 – zaerymoghaddam

+0

可能是一個命名空間問題:如果svg處於其正常的'http:// www.w3.org/2000/svg'命名空間,則無法將其與普通的' svg'在一個xpath表達式中,你需要提供一個[命名空間上下文](http://stackoverflow.com/questions/6390339/how-to-query-xml-using-namespaces-in-java-with-xpath/6392700 #6392700)將uri映射爲前綴,並在表達式中使用前綴。 –