Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 执行子字符串操作时包含分隔符_Java_Xml - Fatal编程技术网

Java 执行子字符串操作时包含分隔符

Java 执行子字符串操作时包含分隔符,java,xml,Java,Xml,在执行子字符串操作时,如何包含分隔符 i、 e.给定字符串message,如下所示: <nutrition> <daily-values> <total-fat units="g">65</total-fat> <saturated-fat units="g">20</saturated-fat> <cholesterol units="mg">300</cholesterol>

在执行子字符串操作时,如何包含分隔符

i、 e.给定字符串
message
,如下所示:

<nutrition>
<daily-values>
    <total-fat units="g">65</total-fat>
    <saturated-fat units="g">20</saturated-fat>
    <cholesterol units="mg">300</cholesterol>
    <sodium units="mg">2400</sodium>
    <carb units="g">300</carb>
    <fiber units="g">25</fiber>
    <protein units="g">50</protein>
</daily-values>
</nutrition>
<food>
    <name>Avocado Dip</name>
    <mfr>Sunnydale</mfr>
    <serving units="g">29</serving>
    <calories total="110" fat="100"/>
    <total-fat>11</total-fat>
    <saturated-fat>3</saturated-fat>
    <cholesterol>5</cholesterol>
    <sodium>210</sodium>
    <carb>2</carb>
    <fiber>0</fiber>
    <protein>1</protein>
    <vitamins>
        <a>0</a>
        <c>0</c>
    </vitamins>
    <minerals>
        <ca>0</ca>
        <fe>0</fe>
    </minerals>
</food>

65
20
300
2400
300
25
50
牛油果蘸酱
萨尼代尔
29
11
3.
5.
210
2.
0
1.
0
0
0
0
然后

message = message.substring(message.indexOf("<food>"), message.indexOf("</food>"));
message=message.substring(message.indexOf(“”),message.indexOf(“”);
返回

<food>
    <name>Avocado Dip</name>
    <mfr>Sunnydale</mfr>
    <serving units="g">29</serving>
    <calories total="110" fat="100"/>
    <total-fat>11</total-fat>
    <saturated-fat>3</saturated-fat>
    <cholesterol>5</cholesterol>
    <sodium>210</sodium>
    <carb>2</carb>
    <fiber>0</fiber>
    <protein>1</protein>
    <vitamins>
        <a>0</a>
        <c>0</c>
    </vitamins>
    <minerals>
        <ca>0</ca>
        <fe>0</fe>
    </minerals>

牛油果蘸酱
萨尼代尔
29
11
3.
5.
210
2.
0
1.
0
0
0
0

如果我不知道XML文件的周围内容,如何让它保留最后一个
标记?

这里有一个使用
javax.XML
的解决方案。它旨在解决文档中存在多个
元素的情况。为了正确处理此情况,您需要

  • 将XML反序列化为
    org.w3c.dom.Document
  • 节点列表提取为
    org.w3c.dom.NodeList
  • 在末尾序列化回字符串
  • 下面是一个简化的示例:

    private static final String XML =
        "<?xml version = \"1.0\" encoding = \"UTF-8\"?>\n"
            + "<message>\n"
            + "  <food>\n"
            + "    <name>A</name>\n"
            + "  </food>\n"
            + "  <food>\n"
            + "    <name>B</name>\n"
            + "  </food>\n"
            + "</message>\n";
    
    @Test
    public void xpath() throws Exception {
      // Deserialize
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      Document document;
      try (InputStream in = new ByteArrayInputStream(XML.getBytes(StandardCharsets.UTF_8))) {
        document = factory.newDocumentBuilder().parse(in);
      }
      XPath xPath = XPathFactory.newInstance().newXPath();
      XPathExpression expr = xPath.compile("//food");
      NodeList nodeList = (NodeList) expr.evaluate(document, XPathConstants.NODESET);
    
      for (int i = 0; i < nodeList.getLength(); i++) {
        Node node = nodeList.item(i);
        System.out.println(node.getNodeName() + ": " + node.getTextContent().trim());
      }
    
      // Serialize
      Document exportDoc = factory.newDocumentBuilder().newDocument();
      Node exportNode = exportDoc.importNode(nodeList.item(0), true);
      exportDoc.appendChild(exportNode);
      String content = serialize(exportDoc);
      System.out.println(content);
    }
    
    private static String serialize(Document doc) throws TransformerException {
      DOMSource domSource = new DOMSource(doc);
      StringWriter writer = new StringWriter();
      StreamResult result = new StreamResult(writer);
      TransformerFactory tf = TransformerFactory.newInstance();
      Transformer transformer = tf.newTransformer();
      // set indent
      transformer.setOutputProperty(OutputKeys.INDENT, "yes");
      transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
      transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
      transformer.transform(domSource, result);
      return writer.toString();
    }
    
    第二个输出显示第一个元素被序列化回字符串:

    <food>
    
      <name>A</name>
    
    </food>
    
    
    A.
    
    您是否尝试过:
    message.indexOf(“”+7
    抱歉输入错误!感谢您的注意:)如果
    是消息的最后一部分,为什么不从
    消息中做一个子字符串。indexOf(“”)
    ,因为它将从该索引一直到最后?Ben的解决方案对您有效吗?这个
    消息怎么样?replaceAll(\\r |\\n)”,“”)。子字符串(message.indexOf(“”),message.indexOf(“”),message.indexOf(“”)。删除行尾会将其视为一个单行字符串。
    
    <food>
    
      <name>A</name>
    
    </food>