Java的。移入xml,其标记名称与子标记相同

时间:2015-08-28 05:35:35

标签: java xml tags element parent

我遇到的问题是我必须使用我工作的公司的提供商发送给我的xml文件。
如果xml构造得很好但是根本没有问题,这不会成为问题。

<catalog>
    <product>
        <ref>4780</ref>
             .
             .
             .
        <arrivals>
            <product>
                <image title="AMARILLO">AMA</image>
                <size>S/T </size>
            </product>
            <product>
                <image title="AZUL">AZUL</image>
                <size>S/T </size>
            </product>
        </arrivals>
    </product>
</catalog>

如您所见,标记<product>包含产品的所有信息,但有更多标记为<product>,以区分何时有不同的颜色。
这是我用来在xml中移动的代码。

doc = db.parse("filename.xml");
Element esproducte = (Element)doc.getElementsByTagName("product").item(0);

NodeList nArrv = esproducte.getElementsByTagName("arrivals");
Element eArrv = (Element) nArrv.item(0);
NodeList eProds = eArrv.getElementsByTagName("product");//THIS THING

for(int l=0; l<eProds.getLength(); l++)
{
Node ln = eProds.item(l);
if (ln.getNodeType() == Node.ELEMENT_NODE)
{
    Element le = (Element) ln;

    //COLORS / IMAGES / CONFIGS
    NodeList nimgcol = le.getElementsByTagName("image");
    Element eimgcol = (Element) nimgcol.item(0);
    System.out.println("Name of the color " + eimgcol.getTextContent());
}

会发生什么事情,因为父母<product>,印刷品应该被重新考虑更多次,而我认为是这样。我认为不应该发生这种情况,因为在我撰写//THIS THING的地方时,我考虑到<product>设置<arrivals>的事实。但它没有用。
我应该在代码中修改什么才能在for而不是3中移动2次,这种情况会发生什么?

解决方案:

NodeList eProds = eArrv.getElementsByTagName("product");//THIS THING

NodeList eProds = eArrv.getChildNodes();//THIS THING

其余完全相同。效果很好。

3 个答案:

答案 0 :(得分:1)

完全有效在不同的父元素中包含标记,这些标记名称相同,但具有不同的内容/含义,如您的示例中所示。

路径为/catalog/product的元素与路径为/catalog/product/arrivals/product的元素完全不同。例如, XPath XML Schema 都会将它们视为不同。

只有懒惰的代码无法区分差异,例如使用getElementsByTagName,无论位置(路径)如何,都将元素定位在任何位置(&#34;所有后代&#34;)。

处理DOM树时,请以结构化方式进行:

  • 迭代根(catalog)的所有子元素(不是所有后代)。
  • 根据严格程度,如果元素未命名为product,则会失败。
  • 对于名为product的每个元素:
    • 迭代product元素的所有子元素。
    • 按名称处理元素,例如refarrivals
    • 如果严格,则在元素名称未知时失败。
    • 如果元素名称为arrivals
      • 迭代arrivals元素的所有子元素。
      • 如果严格,如果元素未命名为product,则会失败。
      • 对于名为product的每个元素:
        • 按名称处理元素,例如imagesize
        • 如果严格,则在元素名称未知时失败。

如您所见,代码中处理名为product的元素中名为catalog的元素的位置与处理元素中名为product的元素的代码不同名为arrivals

答案 1 :(得分:1)

getElementsByTagName为您提供名称为&#34; product&#34;的所有标签在那个标签里面,包括那些&#34;产品&#34;颜色的标签。 尝试使用getChildNodes并检查节点的名称

答案 2 :(得分:1)

正如Andreas所说,文档没有任何效果,问题是使用getElementsByTagName,它只是扫描整个文档以查找具有该标记名称的任何元素,无论结构如何。

您可以使用XPath来简化特定元素的遍历。

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.*;
import java.io.IOException;
import java.io.StringReader;

public class XMLParsing {

    public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException, XPathExpressionException {
        String xml = "<catalog>\n" +
                "    <product>\n" +
                "        <ref>4780</ref>\n" +
                "             .\n" +
                "             .\n" +
                "             .\n" +
                "        <arrivals>\n" +
                "            <product>\n" +
                "                <image title=\"AMARILLO\">AMA</image>\n" +
                "                <size>S/T </size>\n" +
                "            </product>\n" +
                "            <product>\n" +
                "                <image title=\"AZUL\">AZUL</image>\n" +
                "                <size>S/T </size>\n" +
                "            </product>\n" +
                "        </arrivals>\n" +
                "    </product>\n" +
                "</catalog>\n";
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();

        Document document = builder.parse(new InputSource(new StringReader(xml)));
        XPathFactory xPathFactory = XPathFactory.newInstance();
        XPath xPath = xPathFactory.newXPath();

        // get all products under "arrivals"
        XPathExpression expression = xPath.compile("/catalog/product/arrivals//product");

        NodeList nodes = (NodeList) expression.evaluate(document, XPathConstants.NODESET);
        for (int i = 0; i < nodes.getLength(); i++) {
            Node product = nodes.item(i);
            NodeList productChildren = product.getChildNodes();
            for (int j = 0; j < productChildren.getLength(); j++) {
                Node item = productChildren.item(j);
                if (item instanceof Element) {
                    Element element = (Element) item;
                    switch (element.getTagName()) {
                        case "image":
                            System.out.println("product image title : " + element.getAttribute("title"));
                            break;
                        case "size":
                            System.out.println("product size : " + element.getTextContent());
                            break;
                        default:
                            break;
                    }
                }
            }
        }
    }
}
相关问题