验证一个文件中的多个串联 XML
Validate multiple concatenated XML in one file
多个 XML 文件合并为一个文件,请参见下面的演示示例。如何使用 xmlstarlet
或 xmllint
命令验证它?
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?>
<BookHeaderMsg xmlns:xsi="THE URL" xsi:noNamespaceSchemaLocation="NAME.xsd">
<BookHdr>
<tag>value</tag>
<tag2>value</tag2>
</BookHdr>
<Payload>
<payloadTag>value</payloadTag>
<payloadTag2>value</payloadTag2>
</Payload>
</BookHeaderMsg>
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?>
<BookTransfer xmlns:xsi="THE URL" xsi:noNamespaceSchemaLocation="NAME.xsd">
<BookHdr>
<tag>value</tag>
<tag2>value</tag2>
</BookHdr>
<Payload>
<payloadTag>value</payloadTag>
<payloadTag2>value</payloadTag2>
</Payload>
</BookTransfer>
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?>
<BookTransfer xmlns:xsi="THE URL" xsi:noNamespaceSchemaLocation="NAME.xsd">
<BookHdr>
<tag>value 1</tag>
<tag2>value 2</tag2>
</BookHdr>
<Payload>
<payloadTag>value 1</payloadTag>
<payloadTag2>value 2</payloadTag2>
</Payload>
</BookTransfer>
我试过 xmlstarlet val Filename
并且 xmllint --valid Filename
都返回无效。但是,如果我将每个 XML 拆分为单独的文件,那么它们是有效的(不幸的是,拆分是不可行的)。
我按照以下步骤验证了 XML 个由多个其他 XML 文档组合而成的文件:
- 创建循环遍历文件
- 使用
csplit
命令从组合文件中拆分XML个文档
- 使用
xmlstarlet
命令验证步骤 2 中的拆分 XML 文档并将其输出重定向到日志文件
- 使用
rm
命令 从步骤 2 中删除拆分的 XML 文档
- 对其他文件重复上述过程
脚本:
#!/bin/bash
SOURCE_DIR="./src"
LOG_DIR="./log"
files=()
while IFS='' read -r -d ''
do
files+=("$REPLY")
done < <(find "$SOURCE_DIR" -maxdepth 1 -type f -iname "*.xml" -printf '%p[=10=]' | sort -zn)
total="${#files[@]}"
echo "start validating $total files" > "$LOG_DIR/summary.log"
counter=0
for file in "${files[@]}"
do
((counter++))
# extract
csplit "$file" --prefix="$file" --suffix-format='_%03d.xml.txt' --keep-files --elide-empty-files '/<?xml/' '{*}' &>/dev/null
echo "$counter of $total working on $file"
echo "$counter of $total working on $file" >> "$LOG_DIR/summary.log"
# validate
xmlstarlet val "$SOURCE_DIR"/*.xml.txt >> "$LOG_DIR/summary.log"
# clean up
rm "{$SOURCE_DIR}"/*.xml.txt
done
多个 XML 文件合并为一个文件,请参见下面的演示示例。如何使用 xmlstarlet
或 xmllint
命令验证它?
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?>
<BookHeaderMsg xmlns:xsi="THE URL" xsi:noNamespaceSchemaLocation="NAME.xsd">
<BookHdr>
<tag>value</tag>
<tag2>value</tag2>
</BookHdr>
<Payload>
<payloadTag>value</payloadTag>
<payloadTag2>value</payloadTag2>
</Payload>
</BookHeaderMsg>
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?>
<BookTransfer xmlns:xsi="THE URL" xsi:noNamespaceSchemaLocation="NAME.xsd">
<BookHdr>
<tag>value</tag>
<tag2>value</tag2>
</BookHdr>
<Payload>
<payloadTag>value</payloadTag>
<payloadTag2>value</payloadTag2>
</Payload>
</BookTransfer>
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?>
<BookTransfer xmlns:xsi="THE URL" xsi:noNamespaceSchemaLocation="NAME.xsd">
<BookHdr>
<tag>value 1</tag>
<tag2>value 2</tag2>
</BookHdr>
<Payload>
<payloadTag>value 1</payloadTag>
<payloadTag2>value 2</payloadTag2>
</Payload>
</BookTransfer>
我试过 xmlstarlet val Filename
并且 xmllint --valid Filename
都返回无效。但是,如果我将每个 XML 拆分为单独的文件,那么它们是有效的(不幸的是,拆分是不可行的)。
我按照以下步骤验证了 XML 个由多个其他 XML 文档组合而成的文件:
- 创建循环遍历文件
- 使用
csplit
命令从组合文件中拆分XML个文档 - 使用
xmlstarlet
命令验证步骤 2 中的拆分 XML 文档并将其输出重定向到日志文件 - 使用
rm
命令 从步骤 2 中删除拆分的 XML 文档
- 对其他文件重复上述过程
脚本:
#!/bin/bash
SOURCE_DIR="./src"
LOG_DIR="./log"
files=()
while IFS='' read -r -d ''
do
files+=("$REPLY")
done < <(find "$SOURCE_DIR" -maxdepth 1 -type f -iname "*.xml" -printf '%p[=10=]' | sort -zn)
total="${#files[@]}"
echo "start validating $total files" > "$LOG_DIR/summary.log"
counter=0
for file in "${files[@]}"
do
((counter++))
# extract
csplit "$file" --prefix="$file" --suffix-format='_%03d.xml.txt' --keep-files --elide-empty-files '/<?xml/' '{*}' &>/dev/null
echo "$counter of $total working on $file"
echo "$counter of $total working on $file" >> "$LOG_DIR/summary.log"
# validate
xmlstarlet val "$SOURCE_DIR"/*.xml.txt >> "$LOG_DIR/summary.log"
# clean up
rm "{$SOURCE_DIR}"/*.xml.txt
done