如何在Java中解析混合节点和文本的XML?

如何在Java中解析混合节点和文本的XML?,java,xml,xpath,xml-parsing,Java,Xml,Xpath,Xml Parsing,我有一个xml格式- <root> <sentence> first part of the text <a id="interpolation_1"> </a> second part of the text <a id="interpolation_2"> </a> </sentence>

我有一个xml格式-

<root>
      <sentence>
           first part of the text 

           <a id="interpolation_1"> </a>

           second part of the text

           <a id="interpolation_2"> </a>
      </sentence>
</root>

正文第一部分
正文第二部分
本质上,
标记表示一个句子,子标记
是句子中插入的部分

XPath表达式
String语句=XPath.evaluate(“句子”,transUnitElement)
将文本作为-
文本的第一部分和第二部分给出,即忽略插值

XPath表达式-

NodeList aList=(NodeList)xPath.evaluate(“/句子/a”,transUnitElement,XPathConstants.NODESET)
提供
元素的列表

如何解析它们以获得
元素以及
元素的文本,而不丢失
元素的顺序和位置

预期产出-
句子的第一部分{interpolation_1}文本的第二部分{interpolation_2}

您要查找的结果可以通过在
句子的子节点上迭代并逐步构建目标字符串来实现。例如:

// retrieve <sentence> as Node, not as text
Node sentence = (Node) xPath.evaluate("sentence", transUnitElement, XPathConstants.NODE);

StringBuilder resultBuilder = new StringBuilder();
NodeList children = sentence.getChildNodes();

for (int i = 0; i < children.getLength(); i++) {
  Node child = children.item(i);
  short nodeType = child.getNodeType();
  switch (nodeType) {
    case Node.TEXT_NODE:
      String text = child.getTextContent().trim();
      resultBuilder.append(text);
      break;
    case Node.ELEMENT_NODE:
      String id = ((Element) child).getAttribute("id");
      resultBuilder.append(" {").append(id).append("} ");
      break;
    default:
      throw new IllegalStateException("Unexpected node type: " + nodeType);
  }
}
// outputs "first part of the text {interpolation_1} second part of the text {interpolation_2}"
System.out.println(resultBuilder.toString());
//作为节点而不是文本检索
节点句子=(Node)xPath.evaluate(“句子”,transUnitElement,XPathConstants.Node);
StringBuilder resultBuilder=新建StringBuilder();
NodeList childrends=句子.getChildNodes();
for(int i=0;i
您是否想过通过一点XSLT转换来实现这一点?在XSLT3.0中,它只是

<xsl:template match="sentence">
  <xsl:apply-templates/>
</xsl:template>
<xsl:template match="a">{<xsl:value-of select="."}</xsl:template>

{