2014-09-12 18 views
0

我有一个我的java字符串一个XML字符串如下对象:得到一个字符串的元素,它看起来像XML和操纵它在Java

<Record><op>Add</op><sensdata>400188711111</sensdata><id>4</id><a1>1111201090467034</a1></Record> 

我需要得到sensdata标签之间的数据掩盖它像4001887XXXXX,并准备下面的XML字符串并记录下来。

<Record><op>Add</op><sensdata>4001887XXXXX</sensdata><id>4</id><a1>1111201090467034</a1></Record> 

sensdata标记可以位于较低或较高位置。

有什么更好的方法来做到这一点?我是否必须使用一些字符串操作或正则表达式或XML解析器来执行此操作?

我有一个附加到这个问题的小查询。如果我需要

之间

<Record> </Record> 

<op>Add</op><sensdata>4001887XXXXX</sensdata><id>4</id><a1>1111201090467034</a1> 
数据我可以得到使用XML解析器。我能够得到像Add4001887XXXXX41111201090467034这样的值。但没有标签。

+12

它的XML - 所以使用XML解析器。 – 2014-09-12 13:33:37

+0

使用Xpath表达式来获取值,然后使用DOM库来附加到XML。 – Sid 2014-09-12 13:35:12

+0

只是请[不要使用正则表达式。](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) – 2014-09-12 13:35:36

回答

1

当你的字符串包含的XML,你应该使用XML解析器。一个适当的例子可以发现here。最重要的是你的问题得到妥善的解决办法是:

ByteArrayInputStream stream = new ByteArrayInputStream("<Record><op>Add</op><sensdata>400188711111</sensdata><id>4</id><a1>1111201090467034</a1></Record>".getBytes()); 
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
Document document = builder.parse(stream); 

NodeList sensdata = document.getDocumentElement().getElementsByTagName("sensdata"); 

现在你有sensdata节点列表。你可以进一步操纵它。要使用给定节点的字符串值,你可以进行如下操作:

String sensData = sensdata.item(0).getTextContent(); 

也许这将是最好写的防守代码在这种情况下,为了避免NPE因此,上述方案应加以防护:

if (sensdata.getLength() > 0) { 
    String sensData = sensdata.item(0).getTextContent();   
} 

由于还指出,在其他的答案人们也可以XPath的使用:

XPath xPath = XPathFactory.newInstance().newXPath(); 
String data = xPath.compile("/Record/sensdata").evaluate(document); 
+0

非常感谢大家的帮助。我用XML解析,它为我工作。 – Anita 2014-09-12 14:28:21

+0

@Anita很高兴有帮助! – 2014-09-12 14:39:34

0

这是如果你不想使用任何XML解析器。

在尝试查找sensdata之前,您可以使用toLowerCase()。不要使用原始字符串来保留区分大小写的数据使用复制的字符串。然后使用相同的索引来操作原始字符串。

int startIndex = yourCopiedString.toLowerCase().indexOf("<sensdata>")+10; 
int endIndex = yourCopiedString.toLowerCase().indexOf("</sensdata>"); 
String dataPart = yourCopiedString.substring(startIndex, endIndex); 

对于替换:

String newEncodedString = yourOriginalString.replace(yourOriginalString.substring(startIndex,endIndex), "XXXXXXXX"); 

如果有给定的子串的重复然后尝试。

String newEncodedString = yourOriginalString.substring(0,startIndex)+ "XXXXXXXX"+yourOriginalString.substring(endIndex,yourOriginalString.lenght); 
0

试试这个

String str = "<Record><op>Add</op><sensdata>400188711111</sensdata><id>4</id><a1>1111201090467034</a1></Record>" 

int start = str.indexOf("<sensdata>"); 
int end = str.indexOf("</sensdata>"); 
String sendDataVal = str.substring(start+10, end); 
2

您还可以使用XPath表达式来获取所需的数据。

因此,该解决方案可能是:

String xml = "<Record><op>Add</op><sensdata>400188711111</sensdata><id>4</id>" 
      + "<a1>1111201090467034</a1></Record>"; 
    DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder builder = null; 
    try { 
     builder = builderFactory.newDocumentBuilder(); 
    } catch (ParserConfigurationException e) { 
     e.printStackTrace(); 
    } 
    Document document = builder.parse(new ByteArrayInputStream(xml.getBytes())); 
    XPath xPath = XPathFactory.newInstance().newXPath(); 
    String data = xPath.compile("/Record/sensdata").evaluate(document); 
    System.out.println(data); 
-1

两条路走在这里,我想:如果这是不太可能这个任务将会改变,一个简单的正则表达式可以为您解决和一行代码。如果问题变得结构化,或者您的应用程序使用大量xml,您可能需要解析它并动态运行。

一个简单的正则表达式可以是:

".*<[sS]ensdata>(.*)</[sS]ensdata>.*", group 1 ("$1") will be your value. 
相关问题