Chromium 中window.DOMParser接口说明c++

一、DOMParser

DOMParser 可以将存储在字符串中的 XMLHTML 源代码解析为一个 DOM Document

备注: XMLHttpRequest 支持从 URL 可寻址资源解析 XML 和 HTML,在其response 属性中返回Document

你可以使用XMLSerializer 接口执行相反的操作 - 将 DOM 树转换为 XML 或 HTML 源。

对于 HTML 文档,你还可以通过设置 Element.innerHTMLouterHTML 属性的值,将部分 DOM 替换为从 HTML 构建的新 DOM 树。还可以读取这些属性以获取对应于相应 DOM 子树的 HTML 片段。

更多参考:DOMParser - Web API | MDN (mozilla.org)

二、DOMParser接口c++定义:

1、dom_parser.idl定义

third_party\blink\renderer\core\xml\dom_parser.idl

cpp 复制代码
// https://w3c.github.io/DOM-Parsing/#the-domparser-interface

enum SupportedType {
    "text/html",
    "text/xml",
    "application/xml",
    "application/xhtml+xml",
    "image/svg+xml"
};

[
    Exposed=Window
] interface DOMParser {
    [CallWith=ScriptState] constructor();
    [NewObject] Document parseFromString(HTMLString str, SupportedType type, optional ParseFromStringOptions options = {});
};

注意:parseFromString返回的是document

例子:

javascript 复制代码
let parser = new DOMParser();
let doc = parser.parseFromString(stringContainingXMLSource, "application/xml");
// 返回一个 Document 对象,但不是 SVGDocument,也不是 HTMLDocument

parser = new DOMParser();
doc = parser.parseFromString(stringContainingXMLSource, "image/svg+xml");
// 返回一个 SVGDocument 对象,同时也是一个 Document 对象。

parser = new DOMParser();
doc = parser.parseFromString(stringContainingHTMLSource, "text/html");
// 返回一个 HTMLDocument 对象,同时也是一个 Document 对象。

支持的类型如下:

  1. "text/html",

  2. "text/xml",

  3. "application/xml",

  4. "application/xhtml+xml",

  5. "image/svg+xml"

2、dom_parser.idl接口实现blink:

third_party\blink\renderer\core\xml\dom_parser.h

third_party\blink\renderer\core\xml\dom_parser.cc

cpp 复制代码
namespace blink {

class Document;
class ParseFromStringOptions;
class LocalDOMWindow;
class ScriptState;

class CORE_EXPORT DOMParser final : public ScriptWrappable {
  DEFINE_WRAPPERTYPEINFO();

 public:
  static DOMParser* Create(ScriptState* script_state) {
    return MakeGarbageCollected<DOMParser>(script_state);
  }

  explicit DOMParser(ScriptState*);

  Document* parseFromString(const String&,
                            const String& type,
                            const ParseFromStringOptions* options);

  void Trace(Visitor*) const override;

  LocalDOMWindow* GetWindow() const { return window_.Get(); }

 private:
  WeakMember<LocalDOMWindow> window_;
};

}  // namespace blink

3、dom_parser.idl接口实现v8:

out\Debug\gen\third_party\blink\renderer\bindings\core\v8\v8_dom_parser.h

out\Debug\gen\third_party\blink\renderer\bindings\core\v8\v8_dom_parser.cc

cpp 复制代码
void ParseFromStringOperationCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
  RUNTIME_CALL_TIMER_SCOPE_DISABLED_BY_DEFAULT(info.GetIsolate(), "Blink_DOMParser_parseFromString");
BLINK_BINDINGS_TRACE_EVENT("DOMParser.parseFromString");

v8::Isolate* isolate = info.GetIsolate();
const ExceptionContextType exception_context_type = ExceptionContextType::kOperationInvoke;
const char* const class_like_name = "DOMParser";
const char* const property_name = "parseFromString";
ExceptionState exception_state(isolate, exception_context_type, class_like_name, property_name);
if (UNLIKELY(info.Length() < 2)) {
  exception_state.ThrowTypeError(ExceptionMessages::NotEnoughArguments(2, info.Length()));
return;
}

v8::Local<v8::Object> v8_receiver = info.This();
DOMParser* blink_receiver = V8DOMParser::ToWrappableUnsafe(isolate, v8_receiver);
ExecutionContext* execution_context_of_document_tree = bindings::ExecutionContextFromV8Wrappable(blink_receiver);
auto&& arg1_str = NativeValueTraits<IDLStringStringContextTrustedHTML>::ArgumentValue(isolate, 0, info[0], exception_state, execution_context_of_document_tree);
if (UNLIKELY(exception_state.HadException())) {
  return;
}
auto&& arg2_type = NativeValueTraits<V8SupportedType>::ArgumentValue(isolate, 1, info[1], exception_state);
if (UNLIKELY(exception_state.HadException())) {
  return;
}
decltype(NativeValueTraits<ParseFromStringOptions>::NativeValue(std::declval<v8::Isolate*>(), std::declval<v8::Local<v8::Value>>(), std::declval<ExceptionState&>())) arg3_options;
if (info[2]->IsUndefined()) {
  arg3_options = ParseFromStringOptions::Create();
} else {
  arg3_options = NativeValueTraits<ParseFromStringOptions>::ArgumentValue(isolate, 2, info[2], exception_state);
if (UNLIKELY(exception_state.HadException())) {
  return;
}
}
auto&& return_value = blink_receiver->parseFromString(arg1_str, arg2_type, arg3_options);
bindings::V8SetReturnValue(info, return_value, blink_receiver);
}

三、更多xml解析具体实现参考 third_party\blink\renderer\core\xml\文件夹下

相关推荐
@业精于勤荒于嬉8 分钟前
将图片存储至阿里云 OSS
前端·阿里云·云计算·oss
前端Hardy24 分钟前
HTML&CSS&JS:必学!用粒子爆炸效果,让按钮点击 “告别枯燥”
javascript·css·html
前端Hardy26 分钟前
HTML&CSS&JS:必看!主题“自动换装”,10+风格随机切换超惊艳
javascript·css·html
打野赵怀真33 分钟前
render函数中return如果没有使用()会有什么问题?
前端·javascript
Scraper002435 分钟前
如何使用API和Node.js抓取Google新闻?
javascript
Riesenzahn35 分钟前
写一个左中右的满屏布局,左右固定220px,中间自适应并且要优先加载
前端·javascript
Riesenzahn36 分钟前
css在页面上画一个正方形,边长为页面宽度的一半
前端·javascript
tommyrunner37 分钟前
Cursor rule文件测试 一秒了解AI行为规则文件
前端·cursor
北京_宏哥43 分钟前
《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
java·前端·selenium