我必须开发一个Android应用程序.
这里我遵循以下xml格式.
<Product>
<product name="viki" productid="111">
<ProductType>
<producttype>Nokia</producttype>
<producttype>Samsung</producttype>
</ProductType>
</product>
</Product>
Run Code Online (Sandbox Code Playgroud)
在这里,我必须获得particluar product的产品类型.所以我写了以下代码:
if(subCategoryChildNode.hasChildNodes()){
// parse 'Subcategory' childs
NodeList productNL = subCategoryChildElmt.getElementsByTagName("product");
if(productNL.getLength() > 0){
ArrayList<Product> productAL = new ArrayList<Product>();
Product productBean = null;
for(int pCnt=0;pCnt<productNL.getLength();pCnt++){
Node productNode = productNL.item(pCnt);
Element productElmt = null;
// parse 'product' tag attributes
if(productNode.hasAttributes()){
productBean = new Product();
productElmt = (Element)productNode;
productBean.setmProductName(productElmt.getAttribute("name"));
}
if(productNode.hasChildNodes()){
NodeList productTypeNL = productElmt.getElementsByTagName("ProductType");
if(productTypeNL.getLength() > 0){
ArrayList<ProductType> ProductTypeAL = new ArrayList<ProductType>();
ProductType productTypeBean = null;
for(int ptCnt=0;ptCnt<productTypeNL.getLength();ptCnt++){
Node …Run Code Online (Sandbox Code Playgroud) 我目前有以下XML文件。
http://www.cse.unsw.edu.au/~cs9321/14s1/assignments/musicDb.xml
我的XMLParser.java课。
package edu.unsw.comp9321.assignment1;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
public class XMLParser {
public void search () {
try{
File fXmlFile = new File("/COMP9321Assignment1/xml/musicDb.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
} catch (Exception e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
}
我在另一个类中创建一个对象并调用search但我不断收到上述错误。
有人知道可能是什么问题吗?
感谢您的帮助。
使用节点 v.0.10.29,Express v4.12.0和xmldom v0.1.19,我正在尝试执行以下操作:
<name>default</name>字段设置为<name>test</name>问题在于,设置<name>字段后,它在对象中的设置正确,但是当我将其转换为字符串时,该<name>字段又恢复为旧值(错误)。
代码如下所示:
var fs = require('fs');
var DOMParser = require('xmldom').DOMParser;
var XMLSerializer = require('xmldom').XMLSerializer;
var filename = "myFile.xml";
fs.readFile(filename, "utf-8", function (err,data)
{
//CREATE/PARSE XML OBJECT FROM STRING
var customerConfig = new DOMParser().parseFromString(data);
//SET VALUE TO "TEST" (<name>default</name> TO <name>test</name>)
customerConfig.getElementsByTagName("name")[0].childNodes[0].nodeValue = "test";
//THIS OUTPUTS "test" WHICH IS CORRECT -
console.log(customerConfig.getElementsByTagName("name")[0].childNodes[0].nodeValue);
//SERIALIZE …Run Code Online (Sandbox Code Playgroud) 我在使用DOMParser时遇到了一些麻烦。我正在使用intelliJ IDE并用Typescript编写。
这是我的代码:
public domparser = new DOMParser();
this.domdoc = this.domparser.parseFromString(this.xmlDoc, 'text/xml');
console.log("domdoc: " + this.domdoc);
Run Code Online (Sandbox Code Playgroud)
我domdoc: [object XMLDocument]在控制台中看到
。
关于如何打印XML文档而不只是“ [object XMLDocument]”的任何建议?
谢谢。
这是我的代码:
$myHtml = '
<div class="div-class">
<p>text</p>
<p><a href="#">text</a></p>
</div>
<ul class="some-class">
<li><a href="#" target="_blank" title="something something"><img src="" alt=""></a>
</li>
<li><a href="" target="_blank" title=""><img src="" alt=""></a>
</li>
<li><a href="" target="_blank" title=""><img src=""></a>
</li>
</ul>
';
$doc = new \DOMDocument();
$doc->loadHTML($myHtml, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new \DOMXPath($doc);
$anchors = $xpath->query("//a[@title='something something']");
$list = $xpath->query("//ul[@class='some-class']")[0];
foreach ($anchors as $a) {
$list->removeChild($a->parentNode);
}
var_dump($doc->saveHTML());
Run Code Online (Sandbox Code Playgroud)
从本质上讲,我试图删除一个包含标题为“某物”的锚标记的列表项。但是,当我在应用更改后保存 html 时,列表会在 div 标签内移动。为什么会出现这种情况?谢谢。
现在我已经意识到执行类似的函数
let parser = new DOMParser();
Run Code Online (Sandbox Code Playgroud)
仅当使用浏览器执行时才有效,而不能使用 Express/Node 这样的服务器执行,那么有哪些选项呢?
我读过很多关于 NodeJS 替代 DOMParser 的文章,但还有一些库
https://www.npmjs.com/package/dom-parser
https://www.npmjs.com/package/dom-node-iterator
这些是有效的替代方案吗?我是否安装它们并根据使用它们的是浏览器还是 Node 来调整方法调用?
我问这个问题是因为在 Node.js 上查看像Node.js 上的 HTML 解析器这样的帖子,它看起来并不那么简单
我有一个HTML string例如'<p><span class="text">Hello World!</span></p>'
我将其解析HTML string为DOMusing DOMParser().parseFromString(),因为我想更改innerHTML某些特定elements. 这就是为什么我parse在HTML string来DOM与getElementByClassName我通过他们让我的所有元素,并循环改变它innerHTML。到目前为止,这有效。
更改后innerHTML,我尝试将新的转换DOM回string. 我无法弄清楚如何。我尝试的是将innerHTML或outerHTML(都尝试过)分配给这样的变量:
const parser = new DOMParser();
const doc = parser.parseFromString("<p>Hello World!</p>", "text/html");
console.log(doc.innerHTML) // undefined
console.log(doc.outerHTML) // undefined
Run Code Online (Sandbox Code Playgroud)
const parser = new DOMParser();
const doc = parser.parseFromString("<p>Hello World!</p>", "text/html");
console.log(doc.innerHTML) // undefined
console.log(doc.outerHTML) // undefined
Run Code Online (Sandbox Code Playgroud)
我总是得到undefined。我怎样才能将它解析回 …
为什么以下使用 DOMParser 会导致 HTML 与用作输入的 HTML 不同?它删除 DOCTYPE 和顶级元素之间的空格,删除文档元素 和 之间的空格head,并在 之前添加换行符</body>。
我已经在 Google Chrome、Firefox 和 Safari 中对此进行了测试;我还使用JSoup运行了类似的代码,并得到了完全相同的结果。所以我很确定这不是一个错误。我目前的理论是,这是由某处规范中的某种深奥解析规则引起的。但可能还有其他我误解的事情。
const html = `<!DOCTYPE html>
<html>
<head>
<title>1</title>
</head>
<body>
<div>
Hello, World!
</div>
</body>
</html>`;
const setText = function(id,string) {
document.getElementById(id).appendChild(document.createTextNode(string));
};
const documentToString = function(d) {
return Array.prototype.slice.call(d.childNodes).map(function(node) {
if (node.nodeType == node.ELEMENT_NODE) return node.outerHTML;
if (node.nodeType == node.DOCUMENT_TYPE_NODE) return new XMLSerializer().serializeToString(node);
throw new TypeError("" + node);
}).join("");
};
setText("raw", html);
var parsed = …Run Code Online (Sandbox Code Playgroud)使用 时DOMParser,<video>标签在 Safari 中不起作用,其预览会呈现,但没有控件且无法播放:
const parser = new DOMParser()
const parsed = parser.parseFromString(
document.querySelector('video').outerHTML,
'text/html'
)
document.body.appendChild(parsed.querySelector('body').childNodes[0])Run Code Online (Sandbox Code Playgroud)
<video
width="250"
controls
playsinline
src="https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4#t=0.001"
></video>Run Code Online (Sandbox Code Playgroud)
上面的代码在 Chrome 中按预期工作:
但 Safari 会呈现这个(macOS 和 iOS):
没有控件,无法播放 DOMParser 生成的第二个视频。
这是某种安全功能还是错误?这种行为有什么解决方法吗?
我想美化一些 XML,我发现了以下代码(在这个答案中,JSFiddle)。我这样修改:
const xsltDoc = new DOMParser().parseFromString([
// describes how we want to modify the XML - indent everything
'<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">',
' <xsl:output omit-xml-declaration="yes" indent="yes"/>',
' <xsl:template match="node()|@*">',
' <xsl:copy><xsl:apply-templates select="node()|@*"/></xsl:copy>',
' </xsl:template>',
'</xsl:stylesheet>',
].join('\n'), 'application/xml');
function prettifyXml(sourceXml) {
var xmlDoc = new DOMParser().parseFromString(sourceXml, 'application/xml');
var xsltProcessor = new XSLTProcessor();
// Error happens here:
xsltProcessor.importStylesheet(xsltDoc);
var resultDoc = xsltProcessor.transformToDocument(xmlDoc);
var resultXml = new XMLSerializer().serializeToString(resultDoc);
return resultXml;
};
Run Code Online (Sandbox Code Playgroud)
运行代码时出现错误,但错误没有任何消息。在 Firefox 控制台中看起来像这样:
这是我在调试器中看到的:
该错误也确实发生在原始答案的小提琴中。我想知道这是什么类型的错误以及如何修复它。
我包含 Firefox 标签,因为我认为这不是正常的浏览器行为。我的版本是61.0.2(64位)。
domparser ×10
javascript ×5
html ×3
java ×2
node.js ×2
string ×2
xml-parsing ×2
android ×1
angular ×1
express ×1
firefox ×1
html5-video ×1
parsing ×1
php ×1
reactjs ×1
safari ×1
typescript ×1
webkit ×1
xml ×1
xslt ×1