【问题标题】:Extracting SVG from XML. Which Java XML API to choose? [closed]从 XML 中提取 SVG。选择哪个 Java XML API? [关闭]
【发布时间】:2013-12-09 10:54:58
【问题描述】:

我需要执行以下操作: 解析包含 SVG(可缩放矢量图形)作为部分元素的 XML 文档。 SVG 本身就是 XML。 但我需要将 SVG 部分作为一个整体提取出来,不需要解析 SVG 字符串的内容。

例子:

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

我想解析文档并提取 symbol 标签之间的字符串。

我对 Java XML API 不是很熟悉。 你会推荐哪一个来完成这项任务? DOM、SAX、StAX? 一些食谱将不胜感激。 我了解每个之间的差异,无需解释基础知识。 但似乎没有一个是完美的,因为我需要获取 XML 字符串。

【问题讨论】:

  • 你已经尝试了什么?我认为 XML API 取决于解析的 xml 大小。您也可以尝试 Jsoup - HTML 解析器。它还可以解析XML,使用方便。
  • 我真的不明白这里被搁置的原因。下面提出的答案是对我有很大帮助的答案,那么为什么要禁止进一步有用的答案呢?我可以理解答案可能是基于这里的意见,但这正是我想要的:关于如何在我的特定环境中解决任务的不同的、有争议的意见。请注意,我一般不是要求“最好的”XML API,而是最适合提取 XML 子文档的给定任务,这并不是那么微不足道的恕我直言。

标签: java xml svg


【解决方案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();

【讨论】:

  • 谢谢,这是我所期待的答案。我尝试了您的解决方案,但不幸的是, expr.evaluate 返回一个空节点,我无法弄清楚原因。我的代码有点长,所以我不会在这里发布,但如果我能将它发送给您进行审查,我会很高兴。我不知道这是否可能,因为我没有找到您的电子邮件地址(出于安全原因,这可能是故意的)。
  • 您能发布完整的 XML 文档(或至少是其架构)吗?第一个嫌疑人是您的 XPath 表达式。它可能引用了您文档中的无效地址
  • 可能是命名空间问题:如果 svg 位于其正常的 http://www.w3.org/2000/svg 命名空间中,那么您无法将其与 xpath 表达式中的普通 svg 匹配,您需要提供 namespace context将 uri 映射到前缀,并在表达式中使用前缀。
  • 如果你不想编写自己的 NamespaceContext 实现,Spring has a simple one you can use
  • 好的,所以我设置了 dbFactory.setNamespaceAware(false);摆脱命名空间问题(我希望)。现在 expr.evaluate 返回一个节点。但是 getTextContent 返回一个空字符串。但是,我仍然怀疑这是正确的功能,因为我想要的不是 元素的文本内容(在 XML DOM 意义上)(没有),而是整个 XML 子文档,植根于 节点,作为字符串。我希望有人能理解。我目前正在docs.oracle.com/javase/7/docs/api/org/w3c/dom/Node.html 浏览文档,但似乎没有这样的功能。
猜你喜欢
  • 2016-02-22
  • 2013-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多