【问题标题】:Java .split() Method To Split XML ParametersJava .split() 方法拆分 XML 参数
【发布时间】:2012-08-25 00:08:13
【问题描述】:

我有一个 XML 文档中的这一行:

<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" contentScriptType="text/ecmascript" width="1024" zoomAndPan="magnify" contentStyleType="text/css" viewBox="0 0 1024 768" height="768" preserveAspectRatio="xMidYMid meet" version="1.0">

我希望能够使用 split 方法将其拆分。例如我想将每个参数保存到一个字符串数组中。

所以我想:

contentScriptType="text/ecmascript" 
width="1024" 
zoomAndPan="magnify" 
contentStyleType="text/css" 
viewBox="0 0 1024 768" 
height="768"

etc 等要保存到字符串数组中,有没有使用 split 方法来做到这一点,或者任何人都可以建议一种更简单、更有效的方法来做到这一点?

这是看起来很吓人的正则表达式:

\s(.*?)\s?=(?:(?:\\[,"']|[^,"'])+|"(?:\\"|[^"])*(?<!\\)"|'[^']*'|)

Eclipse 不会接受这个,因为它有无效的字符常量,有人知道如何克服这个错误吗?

【问题讨论】:

  • 您可以使用Xstream 将其映射到一个对象中(我会这样做)。 Xstream 非常简单,几乎不需要任何配置。
  • 为什么不使用真正的 XML 解析器?有很多极端情况,使用split() 正确执行操作将是一个很大的麻烦。
  • 你应该使用an XML parser而不是拆分。
  • 理想情况下,我会将其拆分为一个字符串数组,将每个参数保存为一个字符串。

标签: java xml eclipse parsing split


【解决方案1】:

使用 DOM 或 SAX 读取它,处理属性并将其添加到地图中。

【讨论】:

【解决方案2】:

表示同一个 XML 文档有多种方式(见下文),空格和引号的差异可能会导致难以编写(和维护)正则表达式。

input.xml(表示 1)

<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" contentScriptType="text/ecmascript" width="1024" zoomAndPan="magnify" contentStyleType="text/css" viewBox="0 0 1024 768" height="768" preserveAspectRatio="xMidYMid meet" version="1.0">

input.xml(表示 2)

<?xml version="1.0" encoding="UTF-8"?>
<svg 
     xmlns:xlink = 'http://www.w3.org/1999/xlink'
     xmlns = 'http://www.w3.org/2000/svg' 
     contentScriptType = 'text/ecmascript' 
     width = '1024'
     zoomAndPan = 'magnify'
     contentStyleType = 'text/css'
     viewBox = '0 0 1024 768'
     height = '768'
     preserveAspectRatio = 'xMidYMid meet'
     version = '1.0'>

我建议使用 XML 解析器。下面是如何使用StAX (JSR-173) 来完成它。 StAX 解析器的实现包含在 Java SE 6 中。

演示

package forum12193899;

import java.io.StringReader;

import javax.xml.stream.*;
import javax.xml.transform.stream.StreamSource;

public class Demo {

    public static void main(String[] args) throws Exception {
        XMLInputFactory xif = XMLInputFactory.newFactory();
        StreamSource xml = new StreamSource("src/forum12193899/input.xml");

        String xmlString = "<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns=\"http://www.w3.org/2000/svg\" contentScriptType=\"text/ecmascript\" width=\"1024\" zoomAndPan=\"magnify\" contentStyleType=\"text/css\" viewBox=\"0 0 1024 768\" height=\"768\" preserveAspectRatio=\"xMidYMid meet\" version=\"1.0\">";
        XMLStreamReader xsr = xif.createXMLStreamReader(new StringReader(xmlString));

        xsr.nextTag(); // Advance to "svg" element.
        int attributeCount = xsr.getAttributeCount();
        String[] array = new String[attributeCount];
        for(int x=0; x<attributeCount; x++) {
            StringBuilder stringBuilder = new StringBuilder();
            array[x]= xsr.getAttributeLocalName(x) + "=\"" + xsr.getAttributeValue(x) + "\"";
        }

        // Output the Array
        for(String string : array) {
            System.out.println(string);
        }
    }

}

输出

contentScriptType="text/ecmascript"
width="1024"
zoomAndPan="magnify"
contentStyleType="text/css"
viewBox="0 0 1024 768"
height="768"
preserveAspectRatio="xMidYMid meet"
version="1.0"

【讨论】:

  • 我如何将 xml 传递给这个?我使用 'delta.getOriginal().getLines()' 逐行执行,然后使用每行的一个对象遍历每个循环,我可以将该对象(行)转换为任何内容吗?
  • @BuzzLightyear - XMLInputFactory 可以在许多不同类型的输入上创建一个“XMLStreamReader”。如果您将 XML 作为 String,您可以利用 StringReader 作为输入。
  • @BuzzLightyear - 您的 XML 当前是否表示为 String
  • @BuzzLightyear - 我更新了演示代码以将 String 作为输入而不是 File
  • 感谢您的帮助。我得到了这个错误: ParseError at [row,col]:[1,55] Message: Premature end of file.
【解决方案3】:

如果您出于某种原因不想使用 Sax(我也建议这样做),Eclipse 拒绝您的正则表达式的原因是您必须在模式中转义 \ 并在字符串文字中转义 "。所以您的模式字符串定义应如下所示:

String regex = "\\s(.*?)\\s?=(?:(?:\\\\[,\"']|[^,\"'])+|\"(?:\\\"|[^\"])*(?<!\\)\"|'[^']*'|)";

【讨论】:

    猜你喜欢
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    相关资源
    最近更新 更多