Ana içeriğe geç

XML Parser Options

We can customize parsing by providing different options to the parser;

const {XMLParser} = require('fast-xml-parser');

const options = {
ignoreAttributes : false
};

const parser = new XMLParser(options);
let jsonObj = parser.parse(xmlDataStr);

Her bir seçeneği gerekli örneklerle daha ayrıntılı anlayalım.

allowBooleanAttributes

Değer içermeyen niteliklere izin vermek için.

Varsayılan olarak boolean nitelikler göz ardı edilir.

const xmlDataStr = `<root a="nice" checked><a>wow</a></root>`;

const options = {
ignoreAttributes: false,
attributeNamePrefix : "@_"
};
const parser = new XMLParser(options);
const output = parser.parse(xmlDataStr);

Çıktı

{
"root": {
"@_a": "nice",
"a": "wow"
}
}

Boolean niteliklere izin verdiğinizde, bunlar ayrıştırılır ve true olarak ayarlanır.

const xmlDataStr = `<root a="nice" checked><a>wow</a></root>`;

const options = {
ignoreAttributes: false,
attributeNamePrefix : "@_",
allowBooleanAttributes: true
};
const parser = new XMLParser(options);
const output = parser.parse(xmlDataStr);

Çıktı

{
"root": {
"@_a": "nice",
"@_checked": true,
"a": "wow"
}
}

alwaysCreateTextNode

ipucu

FXP, preserveOrder: true olduğunda her zaman metin düğümü oluşturur. Aksi takdirde, değer doğrudan etiket adı ile bir özelliğe atanır.

Bu seçeneği kullanarak FXP'yi metin düğümü ile bir etiketi oluşturması için zorlayabilirsiniz.

Örnek:

const xmlDataStr = `
<root a="nice" checked>
<a>wow</a>
<a>
wow again
<c> unlimited </c>
</a>
<b>wow phir se</b>
</root>`;

const options = {
ignoreAttributes: false,
// alwaysCreateTextNode: true
};
const parser = new XMLParser(options);
const output = parser.parse(xmlDataStr);

alwaysCreateTextNode: false iken çıktı

{
"root": {
"a": [
"wow",
{
"c": "unlimited",
"#text": "wow again"
}
],
"b": "wow phir se",
"@_a": "nice"
}
}

alwaysCreateTextNode: true iken çıktı

{
"root": {
"a": [
{
"#text": "wow"
},
{
"c": {
"#text": "unlimited"
},
"#text": "wow again"
}
],
"b": {
"#text": "wow phir se"
},
"@_a": "nice"
}
}

attributesGroupName

Bir etiketin tüm niteliklerini verilen bir özellik adı altında gruplamak için.

const xmlDataStr = `<root a="nice" b="very nice" ><a>wow</a></root>`;

const options = {
ignoreAttributes: false,
attributeNamePrefix : "@_",
attributesGroupName : "@_"
};
const parser = new XMLParser(options);
const output = parser.parse(xmlDataStr);

Çıktı

{
"root": {
"@_": {
"@_a": "nice",
"@_b": "very nice"
},
"a": "wow"
}
}

attributeNamePrefix

Nitelikleri JS nesnesinde ayrı olarak tanımak için her niteliğin adına bazı dize ekleyebilirsiniz.

const xmlDataStr = `<root a="nice" ><a>wow</a></root>`;

const options = {
ignoreAttributes: false,
attributeNamePrefix : "@_"
};
const parser = new XMLParser(options);
const output = parser.parse(xmlDataStr);

Çıktı

{
"root": {
"@_a": "nice",
"a": "wow"
}
}

attributeValueProcessor

bilgi

tagValueProcessor ile benzer ancak niteliklere uygulanır.

Örnek

const options = {
ignoreAttributes: false,
attributeValueProcessor: (name, val, jPath) => {
:
}
};
:

cdataPropName

cdataPropName herhangi bir özellik adına ayarlanmazsa, CDATA değerleri etiketin metin değerine birleştirilir.

Örnek

const xmlDataStr = `
<a>
<name>name:<![CDATA[<some>Jack</some>]]><![CDATA[Jack]]></name>
</a>`;

const parser = new XMLParser();
const output = parser.parse(xmlDataStr);

Çıktı

{
"a": {
"name": "name:<some>Jack</some>Jack"
}
}

cdataPropName bir belirli özellik adına ayarlandığında, metin değeri ile CDATA farklı özelliklere ayrıştırılır.

Örnek 2

const options = {
cdataPropName: "__cdata"
}

Çıktı

{
"a": {
"name": {
"__cdata": [
"<some>Jack</some>",
"Jack"
],
"#text": "name:"
}
}
}

commentPropName

commentPropName belirli bir özellik adına ayarlandığında, XML'den yorumlar ayrıştırılır.

Örnek

const xmlDataStr = `
<!--Öğrenci notları aylara göre yüklenmiştir-->
<class_list>
<student>
<!--Öğrenci detayları-->
<!--İkinci bir yorum-->
<name>Tanmay</name>
<grade>A</grade>
</student>
</class_list>`;

const options = {
commentPropName: "#comment"
};
const parser = new XMLParser(options);
const output = parser.parse(xmlDataStr);

Çıktı

{
"#comment": "Öğrenci notları aylara göre yüklenmiştir",
"class_list": {
"student": {
"#comment": [
"Öğrenci detayları",
"İkinci bir yorum"
],
"name": "Tanmay",
"grade": "A"
}
}
}

htmlEntities

Varsayılan olarak FXP, processEntities: true olduğunda XML varlıklarını ayrıştırır. HTML varlıklarını ayrıştırmak için htmlEntities ayarını yapabilirsiniz.

Daha fazla bilgi için varlıklar bölümüne bakın.

ignoreAttributes

Varsayılan olarak ignoreAttributes true ayarındadır. Bu, niteliklerin ayrıştırıcı tarafından göz ardı edildiği anlamına gelir. Niteliklere ilişkin herhangi bir yapılandırma ayarlarsanız ve ignoreAttributes: false ayarlı değilse, etkisi olmayacaktır.

Seçici Nitelik Göz Ardı Etme

Belirli nitelikleri ayrıştırma veya oluşturma sırasında göz ardı etmek için dize, düzenli ifadeler veya geri çağırma işlevlerinden oluşan bir dizi belirtebilirsiniz.

Örnek Girdi XML

<tag
ns:attr1="a1-değeri"
ns:attr2="a2-değeri"
ns2:attr3="a3-değeri"
ns2:attr4="a4-değeri">
değer
</tag>

ignoreAttributes seçeneğini üç farklı şekilde kullanabilirsiniz:

  1. Dize Dizisi: Belirli adlarla nitelikleri göz ardı etme.
  2. Düzenli İfadeler Dizisi: Bir desene uyan nitelikleri göz ardı etme.
  3. Geri Çağırma Fonksiyonu: Özelleştirilmiş mantığa dayanarak nitelikleri göz ardı etme.

Örnek: Dize Dizisine Göre Nitelikleri Göz Ardı Etme

const options = {
attributeNamePrefix: "$",
ignoreAttributes: ['ns:attr1', 'ns:attr2'],
parseAttributeValue: true
};
const parser = new XMLParser(options);
const output = parser.parse(xmlData);

Sonuç:

{
"tag": {
"#text": "değer",
"$ns2:attr3": "a3-değeri",
"$ns2:attr4": "a4-değeri"
}
}

Örnek: Düzenli İfade ile Nitelikleri Göz Ardı Etme

const options = {
attributeNamePrefix: "$",
ignoreAttributes: [/^ns2:/],
parseAttributeValue: true
};
const parser = new XMLParser(options);
const output = parser.parse(xmlData);

Sonuç:

{
"tag": {
"#text": "değer",
"$ns:attr1": "a1-değeri",
"$ns:attr2": "a2-değeri"
}
}

Örnek: Geri Çağırma Fonksiyonu ile Nitelikleri Göz Ardı Etme

const options = {
attributeNamePrefix: "$",
ignoreAttributes: (aName, jPath) => aName.startsWith('ns:') || jPath === 'tag.tag2',
parseAttributeValue: true
};
const parser = new XMLParser(options);
const output = parser.parse(xmlData);

Sonuç:

{
"tag": {
"$ns2:attr3": "a3-değeri",
"$ns2:attr4": "a4-değeri",
"tag2": "değer"
}
}

ignoreDeclaration

Birçok kullanıcı, XML açıklama etiketinin ayrıştırma çıktısından göz ardı edilmesini istediği için ignoreDeclaration: true ayarlayabilirler.

Örnek

const xmlDataStr = `<?xml version="1.0"?>
<?elementnames <fred>, <bert>, <harry> ?>
<h1></h1>`;

const options = {
ignoreDeclaration: true,
attributeNamePrefix : "@_"
};
const parser = new XMLParser(options);
const output = parser.parse(xmlDataStr);

Çıktı

{
"?elementnames": "",
"h1": ""
}

ignorePiTags

Birçok kullanıcı, PI etiketlerinin ayrıştırma çıktısından göz ardı edilmesini istediği için ignorePiTags: true ayarını yapabilirler.

Örnek

const xmlDataStr = `<?xml version="1.0"?>
<?elementnames <fred>, <bert>, <harry> ?>
<h1></h1>`;

const options = {
ignoreDeclaration: true,
ignorePiTags: true,
attributeNamePrefix : "@_"
};
const parser = new XMLParser(options);
const output = parser.parse(xmlDataStr);

Çıktı

{
"h1": ""
}

isArray

Tek bir etiketin dizi veya nesne olarak ayrıştırılıp ayrıştırılmayacağı, FXP tarafından belirlenemez. Bu nedenle isArray yöntemi, bir etiketin dizi olarak ayrıştırılıp ayrıştırılmayacağına karar vermeye yardımcı olabilir.

Örnek

const xmlDataStr = `
<root a="nice" checked>
<a>wow</a>
<a>
wow again
<c> unlimited </c>
</a>
<b>wow phir se</b>
</root>`;

const alwaysArray = [
"root.a.c",
"root.b"
];


const options = {
ignoreAttributes: false,
isArray: (name, jpath, isLeafNode, isAttribute) => {
if( alwaysArray.indexOf(jpath) !== -1) return true;
}
};
const parser = new XMLParser(options);
const output = parser.parse(xmlDataStr);

Çıktı

{
"root": {
"@_a": "nice",
"a": [
"wow",
{
"#text": "wow again",
"c": [
"unlimited"
]
}
],
"b": [
"wow phir se"
]
}
}

numberParseOptions

FXP, dizeyi sayıya ayrıştırmak için strnum kütüphanesini kullanır. Bu özellik, strnum paketinin yapılandırmasını ayarlamanıza olanak tanır.

Örnek

const xmlDataStr = `
<root>
<a>-0x2f</a>
<a>006</a>
<a>6.00</a>
<a>-01.0E2</a>
<a>+1212121212</a>
</root>`;

const options = {
numberParseOptions: {
leadingZeros: true,
hex: true,
skipLike: /\+[0-9]{10}/,
// eNotation: false
}
};
const parser = new XMLParser(options);
const output = parser.parse(xmlDataStr);

Çıktı

{
"root": {
"a": [ -47, 6, 6, -100, "+1212121212" ],
}
}

parseAttributeValue

parseAttributeValue: true seçeneği, nitelik değerlerini ayrıştırmak için ayarlanabilir. Bu seçenek, sayısal değerleri ayrıştırmak için strnum paketini kullanır. Daha kontrollü ayrıştırma için numberParseOptions seçeneğine bakın.

Örnek

const xmlDataStr = `
<root a="nice" checked enabled="true" int="32" int="34">
<a>wow</a>
</root>`;

const options = {
ignoreAttributes: false,
// parseAttributeValue: true,
allowBooleanAttributes: true
};
const parser = new XMLParser(options);
const output = parser.parse(xmlDataStr);

Çıktı

{
"root": {
"a": "wow",
"@_a": "nice",
"@_checked": true,
"@_enabled": "true",
"@_int": "34"
}
}

Boolean nitelikler her zaman true olarak ayrıştırılır. XML Ayrıştırıcı, doğrulama kapatıldığında hata vermez, bu nedenle tekrarlanabilir niteliklerin değerini geçersiz kılar.

parseAttributeValue: true ayarlandığında

{
"root": {
"a": "wow",
"@_a": "nice",
"@_checked": true,
"@_enabled": true,
"@_int": 34
}
}

Doğrulama seçenekleri ayarlandığında veya true olduğunda.

//..
const output = parser.parse(xmlDataStr, {
allowBooleanAttributes: true
});
//..

Çıktı

Error: Attribute 'int' is repeated.:1:48

parseTagValue

parseTagValue: true seçeneği, etiket değerlerini ayrıştırmak için ayarlanabilir. Bu seçenek, sayısal değerleri ayrıştırmak için strnum paketini kullanır. Daha kontrollü ayrıştırma için numberParseOptions seçeneğine bakın.

Örnek

const xmlDataStr = `
<root>
35<nested>34</nested>
</root>`;

const options = {
parseTagValue: true
};
const parser = new XMLParser(options);
const output = parser.parse(xmlDataStr);

Çıktı

{
"root": 35
}

Örnek 2 Girdi

<root>
35<nested>34</nested>
</root>

Çıktı

{
"root": {
"nested": 34,
"#text": 35
}
}

Örnek 3 Girdi

<root>
35<nested>34</nested>46
</root>

Çıktı

{
"root": {
"nested": 34,
"#text": "3546"
}
}

preserveOrder

preserveOrder: true ayarlandığında, bazı uzun çirkin sonuçlar alırsınız. Bunun nedeni, bu seçeneğin, sonuç JS nesnesindeki etiketlerin sırasını korumak için kullanılmasıdır. Bu, XML oluşturucunun, bilgi kaybı olmadan, JS nesnesinden benzer bir XML oluşturmasına da yardımcı olur.

const XMLdata = `
<!--Öğrenci notları aylara göre yüklenmiştir-->
<class_list standard="3">
<student>
<!--Öğrenci detayları-->
<!--İkinci bir yorum-->
<name>Tanmay</name>
<grade>A</grade>
</student>
</class_list>`;

const options = {
commentPropName: "#comment",
preserveOrder: true
};
const parser = new XMLParser(options);
let result = parser.parse(XMLdata);
[
{
"#comment": [
{ "#text": "Öğrenci notları aylara göre yüklenmiştir" }
]
},
{
"class_list": [
{
"student": [
{
"#comment": [
{ "#text": "Öğrenci detayları" }
]
},
{
"#comment": [
{ "#text": "İkinci bir yorum" }
]
},
{
"name": [
{ "#text": "Tanmay" }
]
},
{
"grade": [
{ "#text": "A" }
]
}
]
}
],
":@": {
"standard" : "3"
}
}
]

processEntities

Varsayılan olarak true olarak ayarlanır, varsayılan ve DOCTYPE varlıklarını işlemek için. Daha fazla ayrıntı için Varlıklar bölümüne bakın. XML belgenizde varlık yoksa, daha iyi performans için processEntities: false ayarlamanız önerilir.

removeNSPrefix

Etiket ve niteliğin adlarından ad alanı dizesini kaldırır.

Varsayılan, removeNSPrefix: false'dır.

const xmlDataStr = `<root some:a="nice" ><any:a>wow</any:a></root>`;

const options = {
ignoreAttributes: false,
attributeNamePrefix : "@_"
//removeNSPrefix: true
};
const parser = new XMLParser(options);
const output = parser.parse(xmlDataStr);

Çıktı

{
"root": {
"@_some:a": "nice",
"any:a": "wow"
}
}

removeNSPrefix: true ayarlandığında

const xmlDataStr = `<root some:a="nice" ><any:a>wow</any:a></root>`;

const options = {
ignoreAttributes: false,
attributeNamePrefix : "@_",
removeNSPrefix: true
};
const parser = new XMLParser(options);
const output = parser.parse(xmlDataStr);

Çıktı

{
"root": {
"@_a": "nice",
"a": "wow"
}
}

stopNodes

Belirli bir noktada, bir etiketi ve iç içe geçmiş etiketlerini ayrıştırmak istemiyorsanız stopNodes içerisinde yollarını ayarlayabilirsiniz.

Örnek

const xmlDataStr = `
<root a="nice" checked>
<a>wow</a>
<a>
wow again
<c> unlimited </c>
</a>
<b>wow phir se</b>
</root>`;

const options = {
stopNodes: ["root.a"]
};
const parser = new XMLParser(options);
const output = parser.parse(xmlDataStr);

Çıktı

{
"root": {
"a": [
"wow",
"\n wow again\n <c> unlimited </c>\n "
],
"b": "wow phir se"
}
}

Ayrıca işlenmeyen bir etiket belirtmek istiyorsanız, herhangi bir yolun etkisi olmamalıdır. Örneğin, bir HTML belgesindeki veya etiketi.

const options = {
stopNodes: ["*.pre", "*.script"]
};

Dikkat edin ki bir durdurma düğümü, içeriklerindeki aynı kapama düğümüne sahip olmamalıdır. Örneğin:

<stop>
invalid </stop>
</stop>

İç içe geçmiş durdurma düğümleri de yasaktır.

<stop>
<stop> invalid </stop>
</stop>

tagValueProcessor

tagValueProcessor ile hangi etiket değerinin nasıl ayrıştırılacağını kontrol edebilirsiniz.

  1. Eğer tagValueProcessor undefined veya null dönerse, orijinal değer ayrıştırılmadan ayarlanır.
  2. Eğer farklı bir değer veya farklı veri tipi dönerse, yeni değer ayrıştırılmadan ayarlanır.
  3. Aksi takdirde, orijinal değer ayrıştırma (eğer parseTagValue: true ise) sonrası ayarlanır.
  4. Eğer etiket değeri boşsa, tagValueProcessor çağrılmayacaktır.

Örnek

const xmlDataStr = `
<root a="nice" checked>
<a>wow</a>
<a>
wow again
<c> unlimited </c>
</a>
<b>wow phir se</b>
</root>`;

const options = {
ignoreAttributes: false,
tagValueProcessor: (tagName, tagValue, jPath, hasAttributes, isLeafNode) => {
if(isLeafNode) return tagValue;
return "";
}
};
const parser = new XMLParser(options);
const output = parser.parse(xmlDataStr);

Çıktı

{
"root": {
"a": [
{
"#text": "wow",
"@_a": "2"
},
{
"c": {
"#text": "unlimited",
"@_a": "2"
},
"@_a": "2"
}
],
"b": {
"#text": "wow phir se",
"@_a": "2"
},
"@_a": "nice"
}
}

textNodeName

Bir etiketin metin değeri varsayılan olarak #text özelliğine ayrıştırılır. Bunu her zaman değiştirebilirsiniz.

Örnek

const xmlDataStr = `
<a>
text<b>alpha</b>
</a>`;

const options = {
ignoreAttributes: false,
textNodeName: "$text"
};
const parser = new XMLParser(options);
const output = parser.parse(xmlDataStr);

Çıktı

{
"a": {
"b": "alpha",
"$text": "text"
}
}

transformTagName

transformTagName özellik işlevi, bir etiket adını ihtiyaçlarınız doğrultusunda değiştirmeyi sağlar. Örneğin, 'red-code' 'redCode' ya da 'redCode' 'redcode' olarak dönüştürülmek istenebilir.

transformTagName: (tagName) => tagName.toLowerCase()

transformAttributeName

transformAttributeName özellik işlevi, niteliğin adını değiştirmeye olanak tanır.

transformAttributeName: (attributeName) => attributeName.toLowerCase()

trimValues

Etiket veya niteliğin değerinden çevresindeki boşlukları kaldırır.

Örnek

const xmlDataStr = `
<root attri=" ibu te ">
35 <nested> 34</nested>
</root>`;

const options = {
ignoreAttributes: false,
parseTagValue: true, //varsayılan
trimValues: false
};
const parser = new XMLParser(options);
const output = parser.parse(xmlDataStr);

Çıktı

{
"root": {
"nested": 34,
"#text": "\n 35 \n ",
"@_attri": " ibu te "
}
}

Eğer etiket değeri yalnızca boşluklardan oluşuyorsa ve trimValues: false ise, değer ayrıştırılmayacaktır, hatta parseTagValue: true olmasına rağmen. Benzer şekilde, trimValues: true ve parseTagValue: false durumunda çevresindeki boşluklar kaldırılmayacaktır.

const options = {
ignoreAttributes: false,
parseTagValue: false,
trimValues: true //varsayılan
};

Çıktı

{
"root": {
"nested": "34",
"#text": "35",
"@_attri": "ibu te"
}
}

title: uyumsuzEtiketler description: Uyumsuz Etiketler, eşleşmeyen kapanış etiketleri ve bunların nasıl işlenmesi gerektiği hakkında bilgi verir. XML parsing sırasında dikkate alınması gereken önemli noktaları içerir.

keywords: [Uyumsuz Etiketler, HTML, XML, Parser, Validator, Kapanış Etiketi, Parsing]

uyumsuzEtiketler

Uyumsuz Etiketler, eşleşen bir kapanış etiketi olmayan etiketlerdir. Örneğin, HTML'deki `` etiketi. Parser, validator ve builder'a uyumsuz etiketlerin listesini vererek uyumsuz etiketleri ayrıştırabilirsiniz.

bilgi

Uyumsuz etiketler, XML yapısının geçerliliği açısından kritik öneme sahiptir. Bu nedenle, parser ayarlarında doğru şekilde tanımlanmalıdır.

Örnek

const xmlDataStr = `
<rootNode>
<tag>value</tag>
<empty />
<unpaired>
<unpaired />
<unpaired>

</rootNode>`;
const options = {
unpairedTags: ["unpaired"]
};
const parser = new XMLParser(options);
const output = parser.parse(xmlDataStr);

Çıktı

{
"rootNode": {
"tag": "value",
"empty": "",
"unpaired": [ "", "", ""]
}
}

Not: Uyumsuz etiketler kapanış etiketi olarak kullanılamaz; örneğin `` kullanılamaz.
— XML Dokümantasyonu


etiketGüncelle

Bu özellik, farklı bir isim gönderdiğinizde etiket adını değiştirmenizi, parsing sonucundan bir etiketi atlamanızı sağlayarak false döndüğünüzde veya özellikleri değiştirmeyi mümkün kılar.

const xmlDataStr = `
<rootNode>
<a at="val">value</a>
<b></b>
</rootNode>`;

const options = {
attributeNamePrefix: "",
ignoreAttributes: false,
updateTag(tagName, jPath, attrs){
attrs["At"] = "Ev";
delete attrs["at"];

if(tagName === "a") return "A";
else if(tagName === "b") return false;
}
};
const parser = new XMLParser(options);
const output = parser.parse(xmlDataStr);

> Sonraki: XmlBuilder